Протобуф для 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 по нескольким причинам:
- Он доступен из PyPI, так что вы можете просто
pip install protobuf-to-dict
или включить его в requirements.txt
-
dict
может быть преобразован в json и может быть более полезен, чем строка json
Ответ 3
Попробуйте эту библиотеку для преобразования protobuf в json: https://code.google.com/p/protobuf-json/source/browse/trunk/protobuf_json.py