source

중첩된 JSON 객체의 내부 필드를 해석하는 방법

manysource 2023. 2. 16. 22:07

중첩된 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