python - Python中的JSON转储顺序
问题描述
我正在尝试使用特定格式写入 JSON。我尝试了不同的方法来制作 json.dump 命令以将数据在变量中的呈现方式写入文件。任何尝试的 OrderDict 和 Sort-Keys 建议,之前和在线都推荐过。
2020年 1 月 7 日 - 这是 JSON 文件的订单和创建代码。
data =[]
subData=[]
subData=media_add()
data.append(OrderedDict(
{
"values": [ {
"CaseID": case_id,
"CaseMetadata": [
{
"CaseID":case_id,
"PropertyName":case_name,
"PropertyValue":case_value
}
],
"CaseNumber": case_num,
"ContactEmail": contact_email,
"ContactName": contact_name,
"ContactOrganization": contact_org,
"ContactPhone": contact_phone,
"ContactTitle": contact_title,
"Media": subData,
"TotalMediaFiles": len(final_results),
"TotalPrecategorized": 0,
"SeizureDate": autData[3][1],
"SourceApplicationName": "Autopsy",
"SourceApplicationVersion": autData[5][1]
}]}))
# Serializing json
json_object = json.dumps(data, indent=5)
# Writing to json file
filename= (case_name_fn + " " + date_fn + "." + time_fn + ".json")
with open(filename, "w") as outfile:
json.dump(data, outfile, sort_keys=True, indent = 4, ensure_ascii = False)
更新04/09/2020 下午好,由于具体要求,Python代码需要用Python 2.7编写。我试图在 2.7 而不是 3.6 中重做上述工作,就像原始代码一样,但是我无法让转储保持在代码中写入的顺序。我重新尝试使用 OrderedDict 但这失败了。
是否有另一种方法可以在不使用 json.dump 方法的情况下创建结构化 JSON 文件。
解决方案
要以插入它们的相同顺序打印值,您需要做两件事:
- 不要
sort_keys=True
像在转储到文件的示例中那样设置。这将按字母顺序对它们进行排序,而不是按插入顺序。 - 至少使用 Python 3.6。
第二个是必要的,因为在 Python 3.6 之前,字典不记得插入元素的顺序。如果您设置x = {'a': 1, 'b': 2}
然后迭代它,那么您可能会按顺序'a', 'b'
或'b', 'a'
. 它甚至可能在同一程序的运行之间发生变化!
如果您坚持使用 Python 3.5 或更早版本,则可以使用 anOrderedDict
代替。我知道这就是你现在正在做的。但是您使用{...}
文字语法,它将值放在 a 中dict
,因此在到达之前订单已经丢失OrderedDict
。相反,您必须使用列表或元组:
data.append(OrderedDict(
[
["values", [ [
["CaseID", case_id],
["CaseMetadata", [
[
["CaseID", case_id],
["PropertyName", case_name],
["PropertyValue", case_value]
]
... 等等。如您所见,它非常繁琐。最好只是升级你的 Python 版本。也许您只是偶然使用了 Python 2.7,因为这通常是您python
在命令提示符下运行所得到的。在这种情况下,您可以通过运行来解决您的问题python3
。
推荐阅读
- dart - 如何通过更改下拉项来更新列表视图
- asp.net - 使用从 cpanel 下载的文件运行 mvc Web 应用程序
- ios - CollectionView:如何使位于视图中心的单元格的单元格大小更大?
- python - 拆分包含多个字典的列表
- xamarin - Xamarin.Android 相机触控对焦
- angular - 如何取消订阅Angular中未初始化的订阅
- laravel-5.7 - 如何在 Controller 的一行中声明多个类?
- android - 错误:未知类:“消息”-如何解决?
- c - 在函数create_new_node中连接节点的所有链接是否可以?
- sql - 使用“仅”一种类型的代码检索 id