是否可以从protobuf pb2文件生成JSON/Dict Python对象?

2024-07-03 06:57:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚protobuf描述符或对象是否可以从由prototool生成的pb2文件转换为JSON/Dict Python对象。这就是我到目前为止所做的:

  1. 我写了一个config.proto文件,其中TopConfig作为我的消息
  2. 我运行prototool generate config.proto生成config_pb2.py
  3. 现在我想在Python中生成一个JSON/Dict对象,其默认值为TopConfig
from google.protobuf.json_format import MessageToDict, MessageToJson
import config_pb2.py

j = MessageToJson(config_pb2.py.TopConfig())
d = MessageToDict(config_pb2.py.TopConfig())

这导致在这两种情况下都有一个空的{}字典。我错过了什么


Tags: 文件对象pyimportconfigjsondict描述符
2条回答

好吧,我自己想出来了

我的错误是,我的TopConfig中只嵌套了其他messages,而没有其他数据字段MessageToDict只适用于未列出的messages,它也不会显示enumoneof数据

MessageToDict(config_pb2.py.TopConfig())  # Will produce {}
MessageToDict(config_pb2.py.LowestConfig())  # Will produce {'k1': v1, 'k2': v2}

请注意,它不会显示nested messagesenumoneof,您可以很容易地用逻辑检查它们

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

希望这篇文章能帮助其他人

json_format将省略“未设置”字段。在您的示例中,TopConfig()创建了一个空的TopConfig实例,即没有设置任何字段。因此,{}是该对象的正确JSON表示

然而,有一个^{}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.

我之所以说“几乎”,是因为空的子消息字段仍然不存在

相关问题 更多 >