41

次のような JSON オブジェクトがあります。

{
  "name": "Cain",
  "parents": {
    "mother" : "Eve",
    "father" : "Adam"
  }
}

ここで、「name」と「mother」をこの構造体に解析したいと思います。

struct {
  Name String
  Mother String `json:"???"`
}

struct タグで JSON フィールド名を指定したいのですが、json:...興味のあるトップ オブジェクトではないため、タグとして何を使用すればよいかわかりませんencoding/json。ブログ投稿JSON と Go . motherparents/motherおよびもテストしましparents.motherた。

4

5 に答える 5

20

受信データが動的すぎない限り、構造体を使用できます。

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)
}
于 2012-11-27T22:04:02.737 に答える
19

残念ながら、 とは異なりencoding/xmljsonパッケージはネストされた値にアクセスする方法を提供しません。別の Parents 構造体を作成するか、型を に割り当てる必要がありますmap[string]string。例えば:

type Person struct {
    Name string
    Parents map[string]string
}

次に、次のように母にゲッターを提供できます。

func (p *Person) Mother() string {
    return p.Parents["mother"]
}

Motherこれは現在のコードベースに反映される場合とされない場合があり、フィールドをメソッド呼び出しにリファクタリングすることがメニューにない場合は、現在の構造体をデコードして適合させるための別のメソッドを作成することをお勧めします。

于 2012-11-27T22:41:24.147 に答える
6

Go Playground ですぐに作成したコードを次に示します。

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))
}

もっと良い方法があるかもしれません。他の回答も楽しみです。:-)

于 2012-11-27T21:50:21.553 に答える
5

最近では、gjsonがネストされた JSON プロパティの選択をサポートしています。

name := gjson.Get(json, "name")
mother := gjson.Get(json, "parents.mother")
于 2016-11-27T11:41:53.873 に答える