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

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

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

Go
慕尼黑的夜晚无繁华 2021-10-18 15:16:57
我无法解决如何解组来自以前解组的 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 create2015/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对象?我在这里和这里尝试了这个例子,但他们没有解组嵌套的原始 json 数据,这正是我想要做的。
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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


type CreateMessage struct {

    Id int

}

它会起作用。


笔记:


既然message2已经是一个指针( new(CreateMessage)),你就不必将它的地址传给json.Unmarshal(),它的值就足够了:


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包“智能”足以匹配它们(与"Event"和相同"event")。但是要知道,如果您尝试编组结构,输出将包含"Id"而不是"id".


如果要使用完全不同的字段名称或确保在编组结构时将其小写,则可以使用结构标记来说明它应如何出现在 JSON 文本中,例如:


type CreateMessage struct {

    MyId int `json:"id"`

}


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

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