Загрузка указанных значений ключа в объект json из словаря - PullRequest
1 голос
/ 28 июня 2019

Я хочу загрузить словарь в объект json, но не все ключи и значения.

Пример словаря:

full_dict = {
            'code': 1,
            'length': 20,
            'height': 45,
            'name':"book"
        }

Я хочу сделать этот объект json, и я использовал

json.dumps(full_dict)

Но я хочу загрузить только выбранные поля из этого словаря, как только в этих полях:

part_dict = {
            'length':20,
            'height':45,
            'name':"book"
        }

Подведены итоги, я хочу использовать:

json.dumps(full_dict)

И ожидаем следующий объект json:

{"length": 20, "height": 45, "name": "book"}

Спасибо, ценим ваше время.

Ответы [ 5 ]

2 голосов
/ 28 июня 2019

Я бы всегда держал список ключей, которые вы хотите сохранить, или отбрасывать, или любым другим способом определения того, какие ключи вы хотите.

Затем просто отфильтруйте словарь и создайте новый, чтобы сохранить(инкапсулируйте его как функцию для повторного использования кода):

keys_to_keep = {'length', 'height', 'name'}

part_dict = {key: value for (key: value) in full_dict.items() if key in keys_to_keep}
json.dumps(part_dict)

dict.items() дает пары ключей и значений, которые вы можете перебирать, keys_to_keep - это набор, так что in проверяется в O(1)(другие ответы, которые появились при написании этого, все используют списки, которые проверяют in в O(n)!).

2 голосов
/ 28 июня 2019

Вы можете отфильтровать словарь перед тем, как записать его на диск:

full_dict = {
            'code': 1,
            'length': 20,
            'height': 45,
            'name':"book"
        }

keep = ['length', 'height', 'name']

partial_dict = {k: v for k, v in full_dict.items() if k in keep}
print(partial_dict)

Если полей много, превратить сохранение в словарь для поиска O (1) вместо этого - простая оптимизация.

1 голос
/ 28 июня 2019

Вы можете использовать пользовательский класс JSONEncoder с переопределенным методом encode, чтобы pop выдать ключ code из ввода dict:

class CustomJSONEncoder(json.JSONEncoder): 
    def encode(self, input_obj): 
        if isinstance(input_obj, dict): 
            _ = input_obj.pop('code', None) 
        return super().encode(input_obj) 

Пример:

In [837]: class CustomJSONEncoder(json.JSONEncoder): 
     ...:     def encode(self, input_obj): 
     ...:         if isinstance(input_obj, dict): 
     ...:             _ = input_obj.pop('code', None) 
     ...:         return super().encode(input_obj) 
     ...:                                                                                                                                                                                                   

In [838]: full_dict = { 
     ...:             'code': 1, 
     ...:             'length': 20, 
     ...:             'height': 45, 
     ...:             'name':"book" 
     ...:         }                                                                                                                                                                                         

In [839]: json.dumps(full_dict, cls=CustomJSONEncoder)                                                                                                                                                      
Out[839]: '{"length": 20, "height": 45, "name": "book"}'

Как показано, передайте класс кодировщика как cls аргумент json.dumps.

1 голос
/ 28 июня 2019

Вы можете отфильтровать ключи

import json

full_dict = {
    'code': 1,
    'length': 20,
    'height': 45,
    'name':"book"
}

filtered = dict([(k, v) for k, v in full_dict.items() if k in ['length', 'height', 'name']])

print(json.dumps(filtered))

{"length": 20, "height": 45, "name": "book"}

1 голос
/ 28 июня 2019

Python 3,6

exclusion_list = ['code']
json.dumps({x:y for x,y in full_dict.items() if x not in exclusion_list)

или

inclusion_list = ['height', 'length', 'name']
json.dumps({x:y for x,y in full_dict.items() if x in inclusion_list )
...