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

无法将 json 编组为 protobuf 消息

无法将 json 编组为 protobuf 消息

Go
慕森卡 2022-06-13 10:20:17
我的问题与这个问题几乎相反: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像这样使用时,respa在哪里*http.Response:msg := &MyMsg{}jsonpb.Unmarshal(resp.Body, msg)消息没有完全解码到结构中,即缺少一些嵌套结构。然而,当消息被简单地解码时,encoding/json如下所示:msg := &MyMsg{}json.NewDecoder(resp.Body).Decode(msg)所有属性都成功解码到结构中。正如jsonpbprotobuf/json 之间(un)marshall 的官方包一样,我想知道是否有人知道为什么会发生这种行为。的默认行为jsonpb和encoding/json不同之处是否可以解释一个能够解组而另一个不能?如果是这样,将在哪里配置相应的行为jsonpb?
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

的默认行为encoding/json如下:

  1. 允许未知字段,即如果字段不匹配,则直接忽略它而不会引发错误。

  2. 在它被忽略之前,解码器尝试匹配不区分大小写的字段

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

var umrsh = jsonpb.Unmarshaler{}

umrsh.AllowUnknownFields = true

msg := &MyMsg{}

umrsh.Unmarshal(resp.Body, msg)

似乎不可能从第 2 点复制行为jsonpb。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

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