Go 使用struct解析JSON

Go 使用struct解析JSON,go,Go,我正在尝试使用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() {

我正在尝试使用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()
}

我希望它能打印出名字


下面是如何将JSON解组到结构。您可以在Go游乐场查看:

将数据替换为下一行中的data.M


err:=json.Unmarshalbody,&data

只要您想在字段名称不同的结构上映射json键,就应该添加标记:

    type Message struct {
        Name string `json:"Name"`
        Body string `json:"Body"`
        Time int64  `json:"Time"`
    }

    type Person struct {
        M Message `json:"person"`
    }
你可以找到更多信息


此外,答案简单地解释了go中标记的用途。

代码中有两个问题

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

第二个问题是JSON的结构与struct的结构不匹配。您的人有一个名为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中用这些名称表示结构的字段


您可能会发现这一点很有帮助:

他希望解析JSON并将其解组到结构,而不是相反。问题有点含糊不清,我实际上是在回答示例代码为什么没有打印名称的事实。原因在这一行err:=JSON.Unmarshalbody,&data,数据应替换为数据。消息在数据中声明为M struct。添加标记只会帮助您为JSON表单中的字段指定新名称。消息结构中列出的标记是冗余的。Person结构中的标记虽然确实可以解决这些问题,但并没有真正解决主要问题——他的JSON字段与结构中的字段不匹配。IMO,解决核心问题会好得多,那就是他还没有完全理解我们匹配struct字段和JSON字段的方式。关于标签-它们是完全可选的,您可以跳过它们。示例代码:play.golang.org/p/q7pxv5t2o3hey,感谢您的回答。当我不添加标记人时,它对我有效。但是当json包含例如:body:=[]字节{person:{Name:Alice,body:Hello,Time:1294706395881547000}时,它就不起作用了。如果它完全适合您,请随意接受它作为答案。谢谢
    body := []byte(`{"M":{"Name":"Alice","Body":"Hello","Time":1294706395881547000}}`)

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