为了账号安全,请及时绑定邮箱和手机立即绑定

解析嵌套的 json 文件

解析嵌套的 json 文件

Go
暮色呼如 2023-06-12 15:39:36
我正在解析一个结构不寻常的 JSON 文件,如下所示:{    "394885":     {        "record":         {            "student_name": "Daryl Jones",            "student_number": 123884,            "student_dob": "12/10/1982",            "student_email": "djones@school.ac.uk",        }        },}我一直在研究一些代码演示,但我想将其全部放入一个结构中,然后我计划通过我猜是对象名称的数字字符串来搜索它?我不擅长 JSON 或 Go,这是我到目前为止编写的代码:package mainimport (    "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()    }}我不确定我是否做对了,但会重视任何人必须提供的任何提示或建议。我一直在谷歌搜索,但我发现没有一个样本非常适合我的场景。
查看完整描述

4 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

声明匹配数据结构的 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]ID

err := json.Unmarshal(jsonFile, &records)

if err != nil {

    log.Fatal(err)

}

fmt.Printf("%#v\n", records)

在操场上运行它



查看完整回答
反对 回复 2023-06-12
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

首先,您的 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]id


id没有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第三,您在打开文件后立即放置语句,将其放在块的末尾会破坏目的。


查看完整回答
反对 回复 2023-06-12
?
不负相思意

TA贡献1777条经验 获得超10个赞

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

    }

}


查看完整回答
反对 回复 2023-06-12
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

您可以将此结构用于您的 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 规范中是不允许的


查看完整回答
反对 回复 2023-06-12
  • 4 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信