我正在试图找出一个protobuf描述符或对象是否可以从由pb2生成的prototool文件中转换为JSON/Dict对象。这就是我到目前为止所做的:
我用config_pb2.py.
TopConfig作为消息的config.proto文件,运行
TopConfig默认值的JSON/Dict对象from google.protobuf.json_format import MessageToDict, MessageToJson
import config_pb2.py
j = MessageToJson(config_pb2.py.TopConfig())
d = MessageToDict(config_pb2.py.TopConfig())这在这两种情况下都会产生一个空的{}字典。我遗漏了什么?
发布于 2021-04-01 20:58:15
好吧,所以我自己想出来了。
我的错误是,我的TopConfig中只嵌套了其他messages,而没有其他数据字段。MessageToDict只适用于未嵌套的messages,也不会显示enum和oneof数据。
MessageToDict(config_pb2.py.TopConfig()) # Will produce {}
MessageToDict(config_pb2.py.LowestConfig()) # Will produce {'k1': v1, 'k2': v2}请注意,它不会显示nested messages、enum和oneof,您可以很容易地进行逻辑检查。
config_pb2.py.TopConfig().DESCRIPTOR.oneofs # True if it has oneofs type
config_pb2.py.TopConfig().DESCRIPTOR.enum_types # True if it has enum type希望这篇文章能对未来的人有所帮助。
发布于 2021-04-06 21:05:18
json_format将省略"unset“字段。在您的示例中,TopConfig()创建一个空的TopConfig实例,即没有设置字段。因此,{}是该对象的正确JSON表示。
但是,有一个including_default_value_fields to MessageToDict几乎就是您想要的:
including_default_value_fields: If True, singular primitive fields,
repeated fields, and map fields will always be serialized. If
False, only serialize non-empty fields. Singular message fields
and oneof fields are not affected by this option.我说“几乎”是因为空的子消息字段仍然不存在。
https://stackoverflow.com/questions/66905193
复制相似问题