87

protobufPython で使用して逆シリアル化するオブジェクトがあります。オブジェクトを印刷すると、Python オブジェクトのように見えますが、変換しようとすると、jsonあらゆる種類の問題が発生します。

たとえば、使用すると、オブジェクト (protoc から生成されたコード) に _ dict _ エラーjson.dumps()が含まれていないことがわかります。

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)
4

5 に答える 5

184

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

from google.protobuf.json_format import MessageToJson

json_obj = MessageToJson(org)

protobuf を辞書にシリアライズすることもできます。

from google.protobuf.json_format import MessageToDict
dict_obj = MessageToDict(org)

protobuf パッケージの API ドキュメントを参照してください: https://developers.google.com/protocol-buffers/docs/reference/python/ (モジュールを参照google.protobuf.json_format)。

于 2016-09-25T08:50:58.950 に答える
0

proto3 オブジェクトを JSON オブジェクト (つまり、Python 辞書) に変換する関数は次のとおりです。

def protobuf_to_dict(proto_obj):
    key_list = proto_obj.DESCRIPTOR.fields_by_name.keys()
    d = {}
    for key in key_list:
        d[key] = getattr(proto_obj, key)
    return d

Google の protobuf ライブラリのコンバーターは 3.19 バージョンでは機能しない場合があるため、この関数は各 Protobuf オブジェクトに存在する Descriptor クラスを利用します。

ここで、getattr(obj, string_attribute)によって与えられた値を返しますobj.attribute

于 2022-02-06T09:23:12.723 に答える