Protobuf到python中的json

exH*_*ash 41 python json protocol-buffers

我有一个protobuf在Python中反序列化的对象.当我打印对象时,它看起来像一个python对象,但是当我尝试将其转换为json我有各种各样的问题时.

例如,如果我使用json.dumps()我得到的对象(从protoc生成的代码)不包含_ dict _错误.

如果我使用jsonpickle,我会得到UnicodeDecodeError: 'utf8' codec can't decode byte 0x9d in position 97: invalid start byte.

下面的测试代码使用jsonpickle上面显示的错误.

if len(sys.argv) < 2:
    print ("Error: missing ser file")
    sys.exit()
else :
    fileLocation = sys.argv[1]

org = BuildOrgObject(fileLocation) 

org = org.Deserialize()


#print (org)
jsonObj = jsonpickle.encode(org)
print (jsonObj)
Run Code Online (Sandbox Code Playgroud)

小智 100

我建议使用google的protobuf库中的protobuf↔json转换器:

from google.protobuf.json_format import MessageToJson

jsonObj = MessageToJson(org)
Run Code Online (Sandbox Code Playgroud)

请参阅protobuf包API:https://developers.google.com/protocol-buffers/docs/reference/python/(请参阅模块google.protobuf.json_format).

请注意,您也可以将protobuf序列化为Dict

from google.protobuf.json_format import MessageToDict
dict_obj = MessageToDict(org)
Run Code Online (Sandbox Code Playgroud)

  • `MessageToJson(org,preserving_proto_field_name = True)`如果你不希望你的`field_name`转换成`fieldName` (8认同)
  • 它对我不起作用。我收到错误消息:AttributeError:'Schema'对象没有属性'DESCRIPTOR' (4认同)
  • 如果您在重复的子字段(而不是常规消息)上运行此命令,那么它将因缺少描述符而失败。使用主要消息,或转换为字典每个元素并组合 (3认同)

Kev*_*ill 12

如果您需要直接访问json,请查看protobuf-to-json库,但您必须手动安装它.

但我建议您使用protobuf-to-dict库,原因如下:

  1. 它可以从pypi访问,所以你可以简单地pip install protobuf-to-dict或包含在一个requirements.txt
  2. dict 可以转换为json,可能比json字符串更有用

  • 现在有一种方法包括使用protobuf转换为dict而不是json.它被称为:`google.protobuf.json_format.MessageToDict` (8认同)
  • 需要实现 MyMessage 才能使事情顺利进行。有点不完整,因为这是解析原型的重要部分? (2认同)