解析嵌套的 json 文件

我正在解析一个结构不寻常的 JSON 文件,如下所示:


{

    "394885": 

    {

        "record": 

        {

            "student_name": "Daryl Jones",

            "student_number": 123884,

            "student_dob": "12/10/1982",

            "student_email": "djones@school.ac.uk",

        }    

    },

}

我一直在研究一些代码演示,但我想将其全部放入一个结构中,然后我计划通过我猜是对象名称的数字字符串来搜索它?


我不擅长 JSON 或 Go,这是我到目前为止编写的代码:


package main


import (

    "encoding/json"

    "fmt"

    "io/ioutil"

    "os"

)


type id struct {

    recordid string

    record   []record

}


type record struct {

    name   string

    number uint32

    dob    string

    email  string

}


func main() {

    jsonFile, err := os.Open("/home/emyrw/development/go/src/json_processor/demo.json")

    if err != nil {

        fmt.Println(err)

    } else {

        var records id


        byteValue, _ := ioutil.ReadAll(jsonFile)

        json.Unmarshal(byteValue, &records)

        fmt.Println(records)


        fmt.Println("opened demo.json")

        defer jsonFile.Close()

    }

}

我不确定我是否做对了,但会重视任何人必须提供的任何提示或建议。我一直在谷歌搜索,但我发现没有一个样本非常适合我的场景。


暮色呼如
浏览 137回答 4
4回答

慕盖茨4494581

声明匹配数据结构的 Go 类型。JSON 数据具有三个级别的对象。使用映射来表示 JSON 中的顶级对象,因为顶级对象具有任意键。将结构用于 JSON 中的低级别对象。使用 JSON 字段标签将 JSON 中使用的 snake case 名称映射到更惯用的 Go 名称。 导出字段,以便 JSON 包可以访问它们。type Record struct {    Name   string `json:"student_name"`    Number uint32 `json:"student_number"`    DOB    string `json:"student_dob"`    Email  string `json:"student_email"`}type ID struct {    Record Record}...var records map[string]IDerr := json.Unmarshal(jsonFile, &records)if err != nil {    log.Fatal(err)}fmt.Printf("%#v\n", records)在操场上运行它。

翻过高山走不出你

首先,您的 JSON 无效。与 GoLang 结构不同,您不需要,在最终对象之后放置。{ “394885”:{ “记录”:{ “student_name”:“Daryl Jones”,“student_number”:123884,“student_dob”:“12/10/1982”,“student_email”:“djones@school.ac.uk “ }} }其次, var records应该通过完全按照 JSON 对象中命名的方式命名结构中的字段,或者使用属性来准确地对 JSON 建模。你的 JSON 的外部不是 type id,它是 typemap[string]idid没有recordid字段,但是它有一个record字段,但是,如果要将 JSON 序列化到结构中,则必须导出结构的字段(以大写字母开头)。这是属性派上用场的地方,type id struct {    Record []record `json:"record"`}与record结构相同,type record struct {    Name string `json:"student_name"`    Email string `json:"student_email"`    // You get the idea...}defer第三,您在打开文件后立即放置语句,将其放在块的末尾会破坏目的。

不负相思意

jsonquery包可以轻松地从 JSON 文档中提取数据,并且它不依赖于定义的结构对象。func main() {    s := `{        "394885":         {            "record":             {                "student_name": "Daryl Jones",                "student_number": 123884,                "student_dob": "12/10/1982",                "student_email": "djones@school.ac.uk"            }            }    }`    doc, err := jsonquery.Parse(strings.NewReader(s))    if err != nil {        panic(err)    }    nodes := jsonquery.Find(doc, "*")    for _, n := range nodes {        fmt.Printf("id: %s \n", n.Data)        name := jsonquery.FindOne(n, "//student_name") // Find student name node        fmt.Printf("student name: %s\n", name.InnerText())        number := jsonquery.FindOne(n, "//student_number") // Find node for student number        fmt.Printf("student number: %s\n", number.InnerText())    }}

慕哥6287543

您可以将此结构用于您的 id 类型type id struct {    record map[string]record}编辑这是带有一些解释的工作解决方案:由于您有一个多级 json,您可以将其解析为嵌套结构。{        "student_name": "Daryl Jones",        "student_number": 123884,        "student_dob": "12/10/1982",        "student_email": "djones@school.ac.uk"} 要解析 json 的这一部分,你需要这个结构type record struct {    Name   string `json:"student_name"`    Number uint32 `json:"student_number"`    Dob    string `json:"student_dob"`    Email  string `json:"student_email"`}必须导出字段(以大写字母开头)并具有与 json 属性匹配的 json 标记。{    "record":     {        "student_name": "Daryl Jones",        "student_number": 123884,        "student_dob": "12/10/1982",        "student_email": "djones@school.ac.uk"    }    }为了让这部分工作,你需要一个像这样的嵌套结构type id struct {     Record record}文件名再次导出,但由于它与您的 json 属性匹配,因此您不需要标签。{"394885":   {    "record":     {        "student_name": "Daryl Jones",        "student_number": 123884,        "student_dob": "12/10/1982",        "student_email": "djones@school.ac.uk"    }      }}由于顶级属性名称是学生 ID,因此您可以使用映射而不是结构 var records map[string]id 并确保你没有尾随逗号,因为这在 json 规范中是不允许的
打开App,查看更多内容
随时随地看视频慕课网APP