Запись объектов protobuf в файл JSON

У меня такой old.JSON файл:

 [{ "id": "333333", "creation_timestamp": 0, "type": "MEDICAL", "owner": "MED.com", "datafiles": ["stomach.data", "heart.data"] }] 

Затем я создаю объект, основанный на файле .proto :

 message Dataset { string id = 1; uint64 creation_timestamp = 2; string type = 3; string owner = 4; repeated string datafiles = 6; } 

Теперь я хочу сохранить этот объект, чтобы вернуть этот объект в другой .JSON файл. Я сделал это:

 import json from google.protobuf.json_format import MessageToJson with open("new.json", 'w') as jsfile: json.dump(MessageToJson(item), jsfile) 

В результате у меня есть:

 "{\n \"id\": \"333333\",\n \"type\": \"MEDICAL\",\n \"owner\": \"MED.com\",\n \"datafiles\": [\n \"stomach.data\",\n \"heart.data\"\n ]\n}" 

Как сделать этот файл похожим на old.JSON файл?

https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.json_format-pysrc

 31 """Contains routines for printing protocol messages in JSON format. 32 33 Simple usage example: 34 35 # Create a proto object and serialize it to a json format string. 36 message = my_proto_pb2.MyMessage(foo='bar') 37 json_string = json_format.MessageToJson(message) 38 39 # Parse a json format string to proto object. 40 message = json_format.Parse(json_string, my_proto_pb2.MyMessage()) 41 """ 

также

  89 -def MessageToJson(message, including_default_value_fields=False): ... 99 Returns: 100 A string containing the JSON formatted protocol buffer message. 

Довольно ясно, что эта функция вернет ровно один объект строки типа. Эта строка содержит много json-структуры, но это все еще только строка, касающаяся python.

Затем вы передаете его функции, которая берет объект python (а не json) и сериализует его на json.

https://docs.python.org/3/library/json.html

 json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) Serialize obj as a JSON formatted stream to fp (a .write()-supporting file-like object) using this conversion table. 

Хорошо, как именно вы кодируете строку в json? Ясно, что он не может просто использовать специфические символы json, поэтому их нужно будет избежать. Возможно, есть онлайн-инструмент, например http://bernhardhaeussner.de/odd/json-escape/ или http://www.freeformatter.com/json-escape.html

Вы можете пойти туда, выставить стартовый json из верхней части вашего вопроса, сказать ему, чтобы создать правильный json, и вы вернетесь … почти точно, что вы получаете в нижней части своего вопроса. Прохладно все работает правильно!

(Я говорю почти потому, что одна из этих ссылок добавляет некоторые новые строки самостоятельно, без всякой видимой причины. Если вы кодируете ее с помощью первой ссылки, то ее декодируйте со второй, это точно.)

Но это не тот ответ, который вам нужен, потому что вы не хотели дублировать структуру данных. Вы просто хотели сериализовать его в json один раз и записать это в файл:

 import json from google.protobuf.json_format import MessageToJson with open("new.json", 'w') as jsfile: actual_json_text = MessageToJson(item) jsfile.write( actual_json_text )