【发布时间】:2018-08-21 14:16:59
【问题描述】:
我有一个想要添加到现有 JSON Ojbect 的 JSON 对象。当我添加对象时,它被添加到 JSON 的底部,尽管代码首先添加了新对象。
这是 JSON 的一个示例...
{
"Header": {
"ID": "Bob",
"Description": "Description header_dict"
},
"Body": {
"ItemInvolvesShortfall": {
"SpecifiedBy": {
"category": "Fibre To The Node",
"version": "1.2.0",
"type": "Shortfall Specification",
"ID": "FTTN Shortfall"
},
"DescribedBy": {
"Characteristic": {
"type": "Automatically fulfillable",
"ID": "pillar-patch"
},
"value": "Yes"
}
},
"ID": "Bob",
"Description": "Description body_dict"
}
}
这就是我希望 JSON 的样子。 ID 和 Description 应该在 ItemInvolvesShortfall 之前。
….
"Body": {
"ID": "Bob",
"Description": "Description body_dict",
"ItemInvolvesShortfall": {
"SpecifiedBy": {
"category": "Fibre To The Node",
"version": "1.2.0",
"type": "Shortfall Specification",
"ID": "FTTN Shortfall"
},
"DescribedBy": {
"Characteristic": {
"type": "Automatically fulfillable",
"ID": "pillar-patch"
},
"value": "Yes"
}
}
}
这是代码 sn-p。
#!/usr/bin/env python
import json
import objectpath
import collections
#READ JSON OFF DISK
data = json.loads(open("/Users/AAAAAAAAAA/Documents/Python/Tuples/json/FTTN.json").read())
json_tree = objectpath.Tree(data['ManageTicketOfWorkRequest'])
#LOOK FOR A JSON OBJECT - ItemInvolvesShortfall
result = tuple(json_tree.execute('$..ItemInvolvesShortfall'))
new_dict=collections.OrderedDict()
header_dict={}
body_dict=collections.OrderedDict()
# CREATE HEADER
header_dict["Header"]={
"ID":"Bob",
"Description":"Description header_dict" }
# CREATE BODY
body_dict={"Body":{
"ID":"Bob",
"Description":"Description body_dict" }
}
#ADD BODY INTO NEW DICTIONARY
new_dict.update(header_dict)
for i in result:
#ADD THE ITEMINVOLVESSHORTFALL INTO BODY. THE ID & DESCRIPTION
#WHICH IS FIRST, NOT BE PUSH BACK. SHOULD I USE A POP OR POP_LEFT
#OR USE A APPEND OR APPEND_LEFT
body_dict["Body"]["ItemInvolvesShortfall"]=i
print('INFO:04 ', a)
print(body_dict)
new_dict.update(body_dict)
print(" ", body_dict)
print("INFO05: ", body_dict)
new_dict.update(body_dict)
print("INFO06: ", new_dict)
【问题讨论】:
-
你为什么要使用
body_dict=collections.OrderedDict(),然后在几行之后用普通的dict替换它?在你的代码末尾,你为什么要两次new_dict.update(body_dict)? -
FWIW,将
OrderedDict与 JSON 结合使用没有多大意义。 JSON 对象(在 Python 中实现为dict)是名称-值对的 无序 集合。因此,任何处理 JSON 数据的软件不得依赖于那些按特定顺序排列的名称-值对,并且任何处理 JSON 的工具都不需要保持对象中的顺序。当然,如果您的 JSON 数据只能由您编写的软件读写,您可以用它做您喜欢的事情。 -
我的想法是 new_dict 将是最终转换为 JSON 的字典。我将在他们自己的字典中创建子 JSON 对象并将它们添加到 new_dict。我认为 OrderedDict 将保留它们添加的序列。序列是导入的,JSON 需要符合客户端 api 提供的规范。
标签: python json dictionary collections