如何在Golang中解析嵌套JSON对象中的内部字段?

kek*_*eks 39 json go

我有一个类似于这个的JSON对象:

{
  "name": "Cain",
  "parents": {
    "mother" : "Eve",
    "father" : "Adam"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想在这个结构中解析"name"和"mother":

struct {
  Name String
  Mother String `json:"???"`
}
Run Code Online (Sandbox Code Playgroud)

我想用json:...struct标签指定JSON字段名称,但是我不知道要用什么作为标记,因为它不是我感兴趣的顶级对象.我在encoding/json包文档和流行文件中都没有发现这一点.博客文章JSON和Go.我还测试mother,parents/motherparents.mother.

Dan*_*iel 19

只要输入的数据不是太动态,就可以使用结构.

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)
}
Run Code Online (Sandbox Code Playgroud)


dsk*_*ner 18

不幸的是,与包不同encoding/xml,json包不提供访问嵌套值的方法.您需要创建单独的Parents结构或指定类型map[string]string.例如:

type Person struct {
    Name string
    Parents map[string]string
}
Run Code Online (Sandbox Code Playgroud)

然后你可以为母亲提供一个吸气剂:

func (p *Person) Mother() string {
    return p.Parents["mother"]
}
Run Code Online (Sandbox Code Playgroud)

这可能会或可能不会播放到您当前的代码库中,如果将Mother字段重构为方法调用不在菜单上,那么您可能需要创建一个单独的方法来解码并符合您当前的结构.


Dan*_*iel 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))
}
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法.我期待看到其他答案.:-)


cha*_*ows 5

最近,gjson支持选择嵌套的JSON属性。

name := gjson.Get(json, "name")
mother := gjson.Get(json, "parents.mother")
Run Code Online (Sandbox Code Playgroud)