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의 정확한 구조를 알고 있다면struct
JSON 텍스트를 커스텀 값으로 마샬링 해제할 수 있습니다.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
'source' 카테고리의 다른 글
angular ui-router: 해결 중인 toState의 $state 정보를 가져옵니다. (0) | 2023.03.25 |
---|---|
리액트 입력에 의한 Lodash 데바운스 (0) | 2023.03.25 |
'react-redux' 모듈에 대한 선언 파일을 찾을 수 없습니다. (0) | 2023.03.25 |
각도 그리드를 사용하여 AM/PM 형식으로 시간 표시 (0) | 2023.03.25 |
@Directive vs @Component in Angular (0) | 2023.03.25 |