Python 将protobuf对象写入JSON文件

Python 将protobuf对象写入JSON文件,python,json,protocol-buffers,Python,Json,Protocol Buffers,我有这样的old.JSON文件: [{ "id": "333333", "creation_timestamp": 0, "type": "MEDICAL", "owner": "MED.com", "datafiles": ["stomach.data", "heart.data"] }] message Dataset { string id = 1; uint64 creation_timestamp = 2; string type

我有这样的
old.JSON
文件:

[{
    "id": "333333",
    "creation_timestamp": 0,
    "type": "MEDICAL",
    "owner": "MED.com",
    "datafiles": ["stomach.data", "heart.data"]
}]
message Dataset {
  string id = 1;
  uint64 creation_timestamp = 2;
  string type = 3;
  string owner = 4;
  repeated string datafiles = 6;
}
然后我基于
.proto
文件创建一个对象:

[{
    "id": "333333",
    "creation_timestamp": 0,
    "type": "MEDICAL",
    "owner": "MED.com",
    "datafiles": ["stomach.data", "heart.data"]
}]
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
文件

很明显,这个函数将只返回一个string类型的对象。这个字符串包含很多json结构,但就python而言,它仍然只是一个字符串

然后将其传递给一个函数,该函数接受一个python对象(不是json),并将其序列化为json

好的,您将如何将字符串编码为json?显然,它不能只使用json特定的字符,因此必须对这些字符进行转义。也许有一个在线工具,比如

你可以去那里,从问题的顶部发布开始的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 )

这和原作有什么不同?我注意到它不在列表中。这就是问题所在吗?@tdelaney是的,这不是一个列表。它有\“而不是just”,并且\n是显式的。您是否直接尝试了
jsfile.write(MessageToJson(item))
。您为列表中的单个
dict
定义了消息类型。根据您在这里发布的内容,我不知道您是否为所附列表定义了另一种消息类型。但是如果你只是对外部列表中的每一项进行编码,你就失去了列表。对于
\n
,请尝试打印字符串。。。它们被渲染为新行。字符串的python表示形式将它们显示为\n,以便您可以看到它们。@Psidom它可以工作,但另存为not list,但我可以手动将
[]
添加到文件中。是的,MessageToJson看起来不错,但会导致新问题解决方案的关键部分只是将json.dump更改为jsfile.write。正如答案所指出的那样,我们不想双重jsonify消息
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 )