web-dev-qa-db-fra.com

Protobuf vers json dans python

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)
36
exHash

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

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:

  1. Il est accessible depuis pypi pour que vous puissiez simplement pip install protobuf-to-dict ou l'inclure dans un requirements.txt
  2. dict peut être converti en json et peut être plus utile qu'une chaîne json
12
Kevin Hill