使用jsonpb解组自定义类型

时间:2018-04-13 23:09:25

标签: go protocol-buffers grpc

将此json对象转换为protobuf的最佳方法是什么?

JSON:

{
  "name": "test",
  "_list": {
    "some1": { "value": 1 },
    "some2": [
      { "value": 2 },
      { "value": 3 },
    ]
  }
}

原:

message Something {
     string name = 1;
     message ListType {
       repeated string = 1;
     }
     map<string, ListType> _list = 2;
   }

如果消息中没有_list,我会使用jsonpb.Unmarsal,但我无法想到在diff包中生成的类型上定义Unmarshaler接口的方法。

我还想过将_list作为Any(json.RawMessage)并在Unmarshal之后处理它(但不能使它工作;错误消息:Any JSON doesn't have '@type'

1 个答案:

答案 0 :(得分:1)

由于_list不一致(不只是字符串列表/值/地图等),而且你提到你使用Any进行调查,你可以考虑发短信:

message Something { string name = 1; google.protobuf.Struct _list = 2; }

https://github.com/golang/protobuf/blob/master/ptypes/struct/struct.proto

有了这个,您可以使用github.com/golang/protobuf/jsonpb编组/解组json到/来自proto消息,{{3}}实际上是为grpc网关设计的,但你也可以使用它