【问题标题】:Python Added Object to DictPython 将对象添加到字典
【发布时间】: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


【解决方案1】:

Python(和大多数其他语言)中的字典没有顺序 - 它们是key:value 对的集合(无序集合)。因此,它们的顺序错误的论点是不正确的,因为数据结构具有顺序的前提是错误的。

【讨论】:

  • 我明白了,也许我应该重新表述我的问题,他们的 json 对象需要按一定的顺序排列,它不是按键排序的,但我需要先 ID,然后是描述和最后是ItemInvolvesShortfall。有我们需要遵守的规范,并且在 ID 和描述之前出现 ItemInvolvesShortfall 将不符合规范。
猜你喜欢
  • 2017-02-09
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2015-01-13
  • 1970-01-01
  • 2012-11-21
  • 2015-09-07
相关资源
最近更新 更多