Я ищу, чтобы загрузить словарь в объект 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"}

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

1
madlicksxxx 28 Июн 2019 в 16:26

5 ответов

Лучший ответ

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

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)

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

2
MatsLindh 28 Июн 2019 в 13:30

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

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
MartenCatcher 28 Июн 2019 в 13:30

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

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

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
h4z3 28 Июн 2019 в 13:34

Вы можете использовать пользовательский класс 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
heemayl 28 Июн 2019 в 13:44

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 )
1
Kurtis Streutker 28 Июн 2019 в 13:30