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)
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)
Jsonに直接進む必要がある場合は、 protobuf-to-json ライブラリをご覧ください。ただし、手動でインストールする必要があります。
ただし、いくつかの理由で protobuf-to-dict ライブラリを使用することをお勧めします。
pip install protobuf-to-dict
またはrequirements.txt
に含めることができますdict
はjsonに変換でき、json文字列よりも便利な場合があります