중첩된 JSON 객체의 내부 필드를 해석하는 방법
다음과 같은 JSON 개체가 있습니다.
{
"name": "Cain",
"parents": {
"mother" : "Eve",
"father" : "Adam"
}
}
이제 "name"과 "mother"를 이 구조로 해석합니다.
struct {
Name String
Mother String `json:"???"`
}
JSON 필드명을 지정합니다.json:...
structure tag는 제가 관심 있는 상위 객체가 아니기 때문에 태그로 무엇을 사용해야 할지 모르겠습니다.패키지 문서나 인기 블로그 포스트 JSON과 Go에서는 아무것도 찾을 수 없었습니다.저도 테스트 해봤어요mother
,parents/mother
그리고.parents.mother
.
수신 데이터가 너무 동적이지 않으면 구조를 사용할 수 있습니다.
http://play.golang.org/p/bUZ8l6WgvL
package main
import (
"fmt"
"encoding/json"
)
type User struct {
Name string
Parents struct {
Mother string
Father string
}
}
func main() {
encoded := `{
"name": "Cain",
"parents": {
"mother": "Eve",
"father": "Adam"
}
}`
// Decode the json object
u := &User{}
err := json.Unmarshal([]byte(encoded), &u)
if err != nil {
panic(err)
}
// Print out mother and father
fmt.Printf("Mother: %s\n", u.Parents.Mother)
fmt.Printf("Father: %s\n", u.Parents.Father)
}
유감스럽게도,encoding/xml
,그json
패키지는 중첩된 값에 액세스할 수 있는 방법을 제공하지 않습니다.별도의 상위 구조를 만들거나 유형을 할당할 수 있습니다.map[string]string
. 예:
type Person struct {
Name string
Parents map[string]string
}
그런 다음 다음과 같이 어머니에게 getter를 제공할 수 있습니다.
func (p *Person) Mother() string {
return p.Parents["mother"]
}
이것은 현재 코드 베이스에 재생될 수도 있고 재생되지 않을 수도 있습니다.Mother
메서드 호출에 대한 필드가 메뉴에 없습니다.그러면 현재 구조를 디코딩하고 준수하기 위한 별도의 메서드를 작성할 수 있습니다.
여기 바둑판에서 금방 만든 코드가 있어
http://play.golang.org/p/PiWwpUbBqt
package main
import (
"fmt"
"encoding/json"
)
func main() {
encoded := `{
"name": "Cain",
"parents": {
"mother": "Eve"
"father": "Adam"
}
}`
// Decode the json object
var j map[string]interface{}
err := json.Unmarshal([]byte(encoded), &j)
if err != nil {
panic(err)
}
// pull out the parents object
parents := j["parents"].(map[string]interface{})
// Print out mother and father
fmt.Printf("Mother: %s\n", parents["mother"].(string))
fmt.Printf("Father: %s\n", parents["father"].(string))
}
더 좋은 방법이 있을지도 몰라또 다른 답변을 기대하고 있겠습니다. :-)
최근 gjson은 중첩된 JSON 속성 선택을 지원합니다.
name := gjson.Get(json, "name")
mother := gjson.Get(json, "parents.mother")
위에서 제시한 것과 같은 중간 구조를 사용하여 해석한 후 해당 값을 실제 구조에 넣는 것은 어떻습니까?
import (
"fmt"
"encoding/json"
)
type MyObject struct{
Name string
Mother string
}
type MyParseObj struct{
Name string
Parents struct {
Mother string
Father string
}
}
func main() {
encoded := `{
"name": "Cain",
"parents": {
"mother": "Eve",
"father": "Adam"
}
}`
pj := &MyParseObj{}
if err := json.Unmarshal([]byte(encoded), pj); err != nil {
return
}
final := &MyObject{Name: pj.Name, Mother: pj.Parents.Mother}
fmt.Println(final)
}
언급URL : https://stackoverflow.com/questions/13593519/how-to-parse-an-inner-field-in-a-nested-json-object
'source' 카테고리의 다른 글
라벨의 Angular.js ng-click 이벤트가 두 번 발생합니다. (0) | 2023.02.16 |
---|---|
대응: '리다이렉트'는 'react-router-dom'에서 내보내지 않습니다. (0) | 2023.02.16 |
connectedRouter 오류: 상태 트리에서 라우터 리듀서를 찾을 수 없습니다. "router" 아래에 마운트해야 합니다. (0) | 2023.02.16 |
잭슨 json을 사용하여 역직렬화를 위해 열거형 필드에 주석을 다는 방법 (0) | 2023.02.16 |
왜 useRef가 필요하고 변수는 변경할 수 없는가? (0) | 2023.02.16 |