编程语言
首页 > 编程语言> > python-将protobuf对象写入JSON文件

python-将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 )

标签:protocol-buffers,json,python
来源: https://codeday.me/bug/20191111/2019585.html