J'ai un objet que je désérialise en utilisant protobuf
en Python. Lorsque j'imprime l'objet, il ressemble à un objet python, mais lorsque j'essaie de le convertir en json
, j'ai toutes sortes de problèmes.
Par exemple, si j'utilise json.dumps()
j'obtiens que l'objet (le code généré à partir de Protocol) ne contient pas d'erreur _ dict _.
Si j'utilise jsonpickle, j'obtiens UnicodeDecodeError: 'utf8' codec can't decode byte 0x9d in position 97: invalid start byte
.
Le code de test ci-dessous utilise jsonpickle
avec l'erreur indiquée ci-dessus.
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)
Je recommanderais d'utiliser les convertisseurs protobuf↔json de la bibliothèque protobuf de google:
from google.protobuf.json_format import MessageToJson
jsonObj = MessageToJson(org)
Reportez-vous à l'API du package protobuf: https://developers.google.com/protocol-buffers/docs/reference/python/ (voir le module google.protobuf.json_format).
Notez que vous pouvez également sérialiser le protobuf en Dict
from google.protobuf.json_format import MessageToDict
dict_obj = MessageToDict(org)
Si vous devez aller directement à json, jetez un œil à la bibliothèque protobuf-to-json , mais vous devrez l'installer manuellement.
Mais je vous recommande d'utiliser la bibliothèque protobuf-to-dict à la place pour plusieurs raisons:
pip install protobuf-to-dict
ou l'inclure dans un requirements.txt
dict
peut être converti en json et peut être plus utile qu'une chaîne json