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

我无法解决如何解组来自以前解组的 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对象?我在这里和这里尝试了这个例子,但他们没有解组嵌套的原始 json 数据,这正是我想要做的。


慕尼黑的夜晚无繁华
浏览 275回答 1
1回答

qq_花开花谢_0

问题很简单,结构的id字段CreateMessage未导出,它以小写字母开头。将其更改为:type CreateMessage struct {&nbsp; &nbsp; Id int}它会起作用。笔记:既然message2已经是一个指针( new(CreateMessage)),你就不必将它的地址传给json.Unmarshal(),它的值就足够了:var message2 = new(CreateMessage)if err := json.Unmarshal(message.Data, message2); err != nil {&nbsp; &nbsp; panic(err)}log.Printf("%+v", message2)输出:2009/11/10 23:00:00 &{Id:5}或者根本不使用new():var message2 CreateMessageif err := json.Unmarshal(message.Data, &message2); err != nil {&nbsp; &nbsp; 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 {&nbsp; &nbsp; MyId int `json:"id"`}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go