我的问题与这个问题几乎相反:Unable to unmarshal json to protobuf struct field
我有一条消息,其中包含以下形式的多个嵌套消息:
message MyMsg {
uint32 id = 1;
message Attribute {
...
}
repeated Attribute attrs = 2;
message OtherAttribute {
...
}
OtherAttribute oAttr = 3;
...
}
某些外部依赖项将发送此消息JSON形式,然后需要将其解组为go
结构。尝试像这样使用jsonpb
时,其中resp
是*http.Response
:
msg := &MyMsg{}
jsonpb.Unmarshal(resp.Body, msg)
消息未完全解码为结构,即缺少某些嵌套结构。但是,当仅使用encoding/json
来解码消息时,就像这样:
msg := &MyMsg{}
json.NewDecoder(resp.Body).Decode(msg)
所有属性均已成功解码为该结构。
由于jsonpb
是protobuf / json之间的(un)marshall的官方软件包,我想知道是否有人对为什么会发生这种行为有任何想法。 jsonpb
和encoding/json
的默认行为是否在某种程度上可以解释一个能够解组而另一个不能解组的方式不同?如果是这样,应该在哪里配置jsonpb
的行为?
答案 0 :(得分:0)
encoding/json
的默认行为如下:
通过使用Unmarshaller
结构并将属性jsonpb
设置为AllowUnknownFields
,可以在true
中复制点1的行为
var umrsh = jsonpb.Unmarshaler{}
umrsh.AllowUnknownFields = true
msg := &MyMsg{}
umrsh.Unmarshal(resp.Body, msg)
似乎无法复制jsonpb
中第2点的行为。