json - 无法将 json 编组为 protobuf 消息
问题描述
我的问题与这个问题几乎相反: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
a在哪里*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
?
解决方案
的默认行为encoding/json
如下:
- 允许未知字段,即如果字段不匹配,则直接忽略它而不会引发错误。
- 在它被忽略之前,解码器尝试匹配不区分大小写的字段
jsonpb
可以通过使用Unmarshaller
结构并将属性设置为AllowUnknownFields
来复制第 1 点中的行为true
var umrsh = jsonpb.Unmarshaler{}
umrsh.AllowUnknownFields = true
msg := &MyMsg{}
umrsh.Unmarshal(resp.Body, msg)
似乎不可能从第 2 点复制行为jsonpb
。
推荐阅读
- java - 当程序在 JAR 中导出时使用 Sqlite JDBC (Intellij)
- vmware - 使用 ovftool 将 vmdk 转换为 ova
- excel - 如何将多个 Word 文件中的表格复制到 Excel 中的单独工作表中,并将工作表命名为 Word doc 的名称?
- c++ - c++:我可以给一个线程一个新值,而它仍在运行还是我必须先结束它?
- java - Gradle 没有在模拟器上构建应用程序
- api - docker-compose 中分离的前端和 php 后端的问题
- python - 如何在运行 PyQt 应用程序时捕获 main 中引发的异常?
- java - 将对象添加到列表
- c++ - 通过简单的动态链接来违反一个定义规则
- python - sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)无法适应类型“系列”