source

Golang에서 유형 맵[string] 인터페이스 {}의 중첩된 맵에 액세스하는 중

nicesource 2023. 3. 25. 11:28
반응형

Golang에서 유형 맵[string] 인터페이스 {}의 중첩된 맵에 액세스하는 중

그래서 JSON 응답을 해석하려고 합니다.깊이는 여러 단계일 수 있습니다.제가 한 일은 다음과 같습니다.

var result map[string]interface{}
json.Unmarshal(apiResponse, &result)

첫째, 이렇게 하는 게 맞습니까?

예를 들어 다음과 같은 응답이 있습니다.

{
  "args": {
            "foo": "bar"
          }
}

액세스 키foo놀이터에서 이렇게 하는 걸 봤어요.

result["args"].(map[string]interface{})["foo"]

여기, 이게 뭐죠?.()표기법?이거 맞는건가요?

표기법x.(T)는 타입 어설션이라고 불립니다.

표현에 대해서x인터페이스 타입과 타입의T, 프라이머리 표현x.(T)라고 단언하다x아니다nil그리고 그 가치가 저장되는 것은x종류T.

예:

result["args"].(map[string]interface{})["foo"]

그 말은 즉, 그 가치의results키와 관련된 맵"args"종류map[string]interface{}(또 다른 맵은string키 및 임의의 값)을 클릭합니다.그리고 키와 관련된 지도의 요소에 접근하고 싶다."foo".

입력 JSON 포맷에 대해 알고 있는 경우는, 범용을 사용할 필요가 있습니다.map[string]interface{}라고 입력합니다.입력 JSON의 정확한 구조를 알고 있다면structJSON 텍스트를 커스텀 값으로 마샬링 해제할 수 있습니다.struct예를 들어 다음과 같이 입력합니다.

type Point struct {
    Name string
    X, Y int
}

func main() {
    in := `{"Name":"center","X":2,"Y":3}`

    pt := Point{}
    json.Unmarshal([]byte(in), &pt)

    fmt.Printf("Result: %+v", pt)
}

출력:

Result: {Name:center X:2 Y:3}

바둑 놀이터에서 시도해 보세요.

입력 모델링

현재 JSON 입력은 다음과 같은 유형으로 모델링할 수 있습니다.

type Data struct {
    Args struct {
        Foo string
    }
}

액세스Foo(Go Playground에서 시험해보세요.

d := Data{}
json.Unmarshal([]byte(in), &d)
fmt.Println("Foo:", d.Args.Foo)

struct는 최적의 옵션입니다만, 필요에 따라서 맵의 타입 선언을 추가하고, 타입 어설션에 도움이 되는 메서드를 추가할 수 있습니다.

package main
import "encoding/json"

type dict map[string]interface{}

func (d dict) d(k string) dict {
   return d[k].(map[string]interface{})
}

func (d dict) s(k string) string {
   return d[k].(string)
}

func main() {
   apiResponse := []byte(`{"args": {"foo": "bar"}}`)
   var result dict
   json.Unmarshal(apiResponse, &result)
   foo := result.d("args").s("foo")
   println(foo == "bar")
}

https://golang.org/ref/spec#Type_declarations

언급URL : https://stackoverflow.com/questions/28806951/accessing-nested-map-of-type-mapstringinterface-in-golang

반응형