web-dev-qa-db-ja.com

pythonのjsonへのProtobuf

Pythonでprotobufを使用して逆シリアル化するオブジェクトがあります。オブジェクトを印刷すると、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)
36
exHash

Googleの protobuf ライブラリのprotobuf↔jsonコンバーターを使用することをお勧めします。

from google.protobuf.json_format import MessageToJson

jsonObj = MessageToJson(org)

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)
92
denis-sumin

Jsonに直接進む必要がある場合は、 protobuf-to-json ライブラリをご覧ください。ただし、手動でインストールする必要があります。

ただし、いくつかの理由で protobuf-to-dict ライブラリを使用することをお勧めします。

  1. Pypiからアクセスできるので、単にpip install protobuf-to-dictまたはrequirements.txtに含めることができます
  2. dictはjsonに変換でき、json文字列よりも便利な場合があります
12
Kevin Hill