登录
首页 >  Golang >  Go问答

无法将 json 解组到 protobuf 消息中

来源:stackoverflow

时间:2024-04-05 13:21:37 379浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《无法将 json 解组到 protobuf 消息中》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我的问题几乎与此相反:无法将 json 解组到 protobuf 结构字段

我有一条消息,其中包含以下形式的多个嵌套消息:

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 之间编组的官方包,我想知道是否有人知道为什么会发生这种类型的行为。 jsonpbencoding/json 的默认行为是否有所不同,这可以解释一个能够解组而另一个不能?如果是这样,在哪里相应地配置 jsonpb 的行为?


解决方案


encoding/json 的默认行为如下:

  1. 允许未知字段,即如果字段不匹配,则系统会简单地忽略该字段,而不会引发错误。
  2. 在忽略该字段之前,解码器会尝试不区分大小写地匹配该字段

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

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

似乎不可能在 jsonpb 中复制第 2 点的行为。

本篇关于《无法将 json 解组到 protobuf 消息中》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>