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

使用结构解析 JSON

使用结构解析 JSON

Go
莫回无 2022-05-18 14:21:43
我正在尝试使用 Go 解析 JSON。谁能告诉我为什么我的代码没有按预期工作?package main  import (    "encoding/json"    "fmt")type Message struct {    Name string    Body string    Time int64}type Person struct {    M Message}func get_content() {    body := []byte(`{"person":{"Name":"Alice","Body":"Hello","Time":1294706395881547000}}`)    var data Person    err := json.Unmarshal(body, &data)    if err != nil {        panic(err.Error())    }    fmt.Printf("%v",data.M.Name)}func main() {    get_content()}我期待它打印名称。
查看完整描述

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

这是将 JSON 解组到结构的方法。你可以在 Go Playground 上查看:


package main


import (

    "encoding/json"

    "fmt"

)

type Message struct {

    Name string

    Body string

    Time int64

}


type Person struct {

    M Message

}


func get_content() {


    body := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)


    var data Person


    err := json.Unmarshal(body, &data.M)


    if err != nil {

        panic(err.Error())

    }

    fmt.Printf(data.M.Name)


}


func main() {

    get_content()

}


替换data为data.M下一行。


err := json.Unmarshal(body, &data)


查看完整回答
反对 回复 2022-05-18
?
holdtom

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

只要您打算将 Json 键映射到其字段具有不同名称的结构上,您就应该添加标签:


    type Message struct {

        Name string `json:"Name"`

        Body string `json:"Body"`

        Time int64  `json:"Time"`

    }


    type Person struct {

        M Message `json:"person"`

    }



查看完整回答
反对 回复 2022-05-18
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

代码中有两个问题。


第一个是上面提到的@umar-hayat -> 您正在解组到data对象中,您应该瞄准该data.M领域。


第二个问题是您的 JSON 结构与您的结构不匹配。您Person有一个名为M. 如果我们想将其表示为 JSON,它将如下所示:


{

  "M": {

    "Name": "Joe",

    "Body": "Hi",

    "time": 2600

  }

}

相反,您在 JSON 中调用person了一个字段,该字段无法与结构中的任何字段匹配。恐怕它与结构类型的名称相似这一事实在任何方面都没有帮助。


因此,您可以更改 JSON 和目标:


    body := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)


    var data Person

    err := json.Unmarshal(body, &data.M)

或者只是你的 JSON:


    body := []byte(`{"M":{"Name":"Alice","Body":"Hello","Time":1294706395881547000}}`)


    var data Person

    err := json.Unmarshal(body, &data)

但是,JSON 中的字段名称必须与结构中的字段名称相匹配。或者,正如 Konstantinos 所提到的,您可以使用标签来指定特定名称,您的结构的字段将使用这些名称在 JSON 中表示。


您可能会发现这很有帮助:https ://gobyexample.com/json


查看完整回答
反对 回复 2022-05-18
  • 3 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

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