无法将json解组到protobuf消息中

时间:2020-06-12 14:29:08

标签: json go protocol-buffers

我的问题与这个问题几乎相反: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的官方软件包,我想知道是否有人对为什么会发生这种行为有任何想法。 jsonpbencoding/json的默认行为是否在某种程度上可以解释一个能够解组而另一个不能解组的方式不同?如果是这样,应该在哪里配置jsonpb的行为?

1 个答案:

答案 0 :(得分:0)

encoding/json的默认行为如下:

  1. 允许使用未知字段,即,如果字段不匹配,则将其忽略而不会引发错误。
  2. 在忽略之前,解码器会尝试在不区分大小写的情况下匹配该字段

通过使用Unmarshaller结构并将属性jsonpb设置为AllowUnknownFields,可以在true中复制点1的行为

var umrsh = jsonpb.Unmarshaler{}
umrsh.AllowUnknownFields = true
msg := &MyMsg{}
umrsh.Unmarshal(resp.Body, msg)

似乎无法复制jsonpb中第2点的行为。