gpt4 book ai didi

json - 解码嵌套的 json 字符串使用 json.RawMessage

转载 作者:IT王子 更新时间:2023-10-29 01:39:32 27 4
gpt4 key购买 nike

我无法思考如何解码来自先前解码的 json 字节数组的原始 json 字符串。我有当前代码:

type Message struct {
Event string
Data json.RawMessage // how data is parsed depends on the event
}

type CreateMessage struct {
id int
}

var evt = []byte(`{"event": "create", "data" :{"id":5 }}`)

func main() {
var message Message
log.Println(string(evt))
json.Unmarshal(evt, &message)

log.Println(message)
log.Println(message.Event)
log.Println(string(message.Data))
fmt.Printf("%+v\n", message)

var message2 = new(CreateMessage)
err := json.Unmarshal( message.Data, &message2 )

log.Println(message2)
log.Println(err)
}

输出是:

2015/06/29 23:22:10 {"event": "create", "data" :{"id":5 }}
2015/06/29 23:22:10 {create [123 34 105 100 34 58 53 32 125]}
2015/06/29 23:22:10 create
2015/06/29 23:22:10 {"id":5 }
{Event:create Data:[123 34 105 100 34 58 53 32 125]}
2015/06/29 23:22:10 &{0}
2015/06/29 23:22:10 <nil>

为什么我不能将数据解码为 CreateMessage 对象?我试过这个例子 herehere但他们不会解码嵌套的原始 json 数据,而这正是我想要做的。

最佳答案

问题很简单,CreateMessage 结构的 id 字段未导出,它以小写字母开头。将其更改为:

type CreateMessage struct {
Id int
}

它会起作用。

注意事项:

由于 message2 已经是一个指针 (new(CreateMessage)),您不必将其地址传递给 json.Unmarshal(),它的值(value)就足够了:

var message2 = new(CreateMessage)
if err := json.Unmarshal(message.Data, message2); err != nil {
panic(err)
}
log.Printf("%+v", message2)

输出:

2009/11/10 23:00:00 &{Id:5}

或者根本不使用new():

var message2 CreateMessage
if err := json.Unmarshal(message.Data, &message2); err != nil {
panic(err)
}
log.Printf("%+v", message2)

输出:

2009/11/10 23:00:00 {Id:5}

Go Playground 上试试.

另请注意,现在字段的名称是 "Id" 并且 JSON 包含 "id"json 包是“intelligent "足以匹配它们(与 "Event""event" 相同)。但是要知道,如果您尝试编码您的结构,输出将包含 "Id" 而不是 "id"

如果您想使用完全不同的字段名称或确保在编码结构时将其小写,您可以使用 struct tags告诉它应该如何出现在 JSON 文本中,例如:

type CreateMessage struct {
MyId int `json:"id"`
}

关于json - 解码嵌套的 json 字符串使用 json.RawMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31131171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com