Protobuf to json in python
I have an object that I de-serialize using protobuf
in Python. When I print the object it looks like a python object, however when I try to convert it to json
I have all sorts of problems.
For example, if I use json.dumps()
I get that the object (the generated code from protoc) does not contain a _ dict _ error.
If I use jsonpickle I get UnicodeDecodeError: 'utf8' codec can't decode byte 0x9d in position 97: invalid start byte
.
Test code below is using jsonpickle
with the error shown above.
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)
Solution 1:
I'd recommend using protobuf↔json converters from google's protobuf library:
from google.protobuf.json_format import MessageToJson
json_obj = MessageToJson(org)
You can also serialise the protobuf to a dictionary:
from google.protobuf.json_format import MessageToDict
dict_obj = MessageToDict(org)
Refer to the protobuf package API documentation: https://developers.google.com/protocol-buffers/docs/reference/python/ (see module google.protobuf.json_format
).
Solution 2:
If you need to go straight to json take a look at the protobuf-to-json library, but you'll have to install that manually.
But I would recommend that you use the protobuf-to-dict library instead for a few reasons:
- It is accessible from pypi so you can simply
pip install protobuf-to-dict
or include it in arequirements.txt
-
dict
can be converted to json and might be more useful than a json string