有没有办法从JSON对象移除图层?

时间:2019-11-01 14:00:03

标签: python json python-3.x

是否可以从JSON对象中删除父层?例如,假设我有以下JSON对象:

{
    "Hello": "World",
    "Parent": {
        "key1": "val1",
        "key2": "val2",
        "key3": {
            "key3a": "val3a",
            "key3b": "val3b"
        },
        "key4": "val4"
    }
}

但是我想删除Parent层,并让JSON对象读取如下:

{
    "Hello": "World",
    "key1": "val1",
    "key2": "val2",
    "key3": {
        "key3a": "val3a",
        "key3b": "val3b"
    },
    "key4": "val4"
}

有没有办法做到这一点?

我最好希望使用Python完成此操作,但是如果有人知道我愿意使用其他方法来完成此操作。

3 个答案:

答案 0 :(得分:3)

尝试一下(字典合并,在Python 3.5中引入):

d = {**d.pop('Parent'), **d}

证明:

import json

d = {
    "Hello": "World",
    "Parent": {
        "key1": "val1",
        "key2": "val2",
        "key3": {
            "key3a": "val3a",
            "key3b": "val3b"
        },
        "key4": "val4"
    }
}

d = {**d.pop('Parent'), **d}

print(json.dumps(d, indent=2))

# {
#   "key1": "val1",
#   "key2": "val2",
#   "key3": {
#     "key3a": "val3a",
#     "key3b": "val3b"
#   },
#   "key4": "val4",
#   "Hello": "World"
# }

答案 1 :(得分:3)

使用dict.popdict.update可以很容易地完成操作:

import json

data = {
    "Hello": "World",
    "Parent": {
        "key1": "val1",
        "key2": "val2",
        "key3": {
            "key3a": "val3a",
            "key3b": "val3b"
        },
        "key4": "val4"
    }
}

data.update(data.pop("Parent"))

print(json.dumps(data, indent=4))
  

输出:

{
   "Hello": "World",
   "key1": "val1",
   "key2": "val2",
   "key3": {
       "key3a": "val3a",
       "key3b": "val3b"
   },
   "key4": "val4"
}

这还具有一个优势,它几乎可以在任何版本的Python中使用。

答案 2 :(得分:0)

这可以通过复制字典,删除'Parent'键,然后使用'Parent'字典内容进行更新来实现。如果有任何同名键,则'Parent'字典中的值将覆盖外部字典中的值。

def flatten_dict(data, key):
    new_data = dict(data)
    del new_data[key]
    new_data.update(data[key])
    return new_data

然后致电flatten_dict(data, 'Parent')。这样会将结果作为新字典返回,而不会更改原始字典。