Есть ли способ удалить слой из объекта JSON? - PullRequest
3 голосов
/ 01 ноября 2019

Есть ли способ удалить родительский слой из объекта 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 ]

3 голосов
/ 01 ноября 2019

Может быть сделано довольно легко с dict.pop и dict.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.

3 голосов
/ 01 ноября 2019

Попробуйте это (слияние словаря, введено в 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"
# }
0 голосов
/ 01 ноября 2019

Этого можно достичь, скопировав dict, удалив ключ 'Parent', а затем обновив его содержимым 'Parent' dict. Если есть какие-либо ключи с таким же именем, значения из 'Parent' dict переопределят значения из внешнего dict.

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'). Это вернет результат как новый диктат без изменения оригинального.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...