gpt4 book ai didi

json - 无法将 json 编码为 protobuf 消息

转载 作者:行者123 更新时间:2023-12-01 22:22:27 25 4
gpt4 key购买 nike

我的问题与这个问题几乎相反: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 的行为?因此?

最佳答案

encoding/json 的默认行为如下:

  • 允许使用未知字段,即如果字段不匹配,它会被简单地忽略而不会引发错误。
  • 在它被忽略之前,解码器会尝试匹配不区分大小写的字段

  • 第 1 点的行为可以在 jsonpb 中复制。通过使用 Unmarshaller 结构和设置属性 AllowUnknownFieldstrue
    var umrsh = jsonpb.Unmarshaler{}
    umrsh.AllowUnknownFields = true
    msg := &MyMsg{}
    umrsh.Unmarshal(resp.Body, msg)

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

    关于json - 无法将 json 编码为 protobuf 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62346394/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com