Ken*_*tov 4 python json protocol-buffers
我有这样的old.JSON文件:
[{
"id": "333333",
"creation_timestamp": 0,
"type": "MEDICAL",
"owner": "MED.com",
"datafiles": ["stomach.data", "heart.data"]
}]
Run Code Online (Sandbox Code Playgroud)
然后我根据.proto文件创建一个对象:
message Dataset {
string id = 1;
uint64 creation_timestamp = 2;
string type = 3;
string owner = 4;
repeated string datafiles = 6;
}
Run Code Online (Sandbox Code Playgroud)
现在我想保存这个对象并将这个对象保存回其他.JSON文件。我这样做了:
import json
from google.protobuf.json_format import MessageToJson
with open("new.json", 'w') as jsfile:
json.dump(MessageToJson(item), jsfile)
Run Code Online (Sandbox Code Playgroud)
结果我有:
"{\n \"id\": \"333333\",\n \"type\": \"MEDICAL\",\n \"owner\": \"MED.com\",\n \"datafiles\": [\n \"stomach.data\",\n \"heart.data\"\n ]\n}"
Run Code Online (Sandbox Code Playgroud)
如何使这个文件看起来像old.JSON文件?
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 """
Run Code Online (Sandbox Code Playgroud)
还
89 -def MessageToJson(message, including_default_value_fields=False):
...
99 Returns:
100 A string containing the JSON formatted protocol buffer message.
Run Code Online (Sandbox Code Playgroud)
很明显,这个函数将返回一个字符串类型的对象。这个字符串包含了很多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.
Run Code Online (Sandbox Code Playgroud)
好的,您将如何将字符串编码为 json?显然,它不能只使用 json 特定字符,因此必须对这些字符进行转义。也许有一个在线工具,比如http://bernhardhaeussner.de/odd/json-escape/或http://www.freeformatter.com/json-escape.html
你可以去那里,从你的问题的顶部发布起始 json,告诉它生成正确的 json,然后你回来......几乎正是你在问题底部得到的。很酷,一切正常!
(我这么说几乎是因为其中一个链接自己添加了一些换行符,没有明显的原因。如果您使用第一个链接对其进行编码,然后使用第二个链接对其进行解码,则完全正确。)
但这不是您想要的答案,因为您不想对数据结构进行双重 jsonify。您只想将其序列化为 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 )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7230 次 |
| 最近记录: |