Протобуф для json в python

У меня есть объект, который я де-сериализую, используя 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)

Ответы

Ответ 1

Я бы рекомендовал использовать преобразователи protobuf↔json из библиотеки goob protobuf:

from google.protobuf.json_format import MessageToJson

jsonObj = MessageToJson(org)

Обратитесь к API пакета protobuf: 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)

Ответ 2

Если вам нужно перейти прямо к json, взгляните на библиотеку protobuf-to-json, но вам придется установить это вручную.

Но я бы рекомендовал использовать библиотеку protobuf-to-dict по нескольким причинам:

  1. Он доступен из PyPI, так что вы можете просто pip install protobuf-to-dict или включить его в requirements.txt
  2. dict может быть преобразован в json и может быть более полезен, чем строка json