Можно ли пропустить вывод конкретного ключа и связанных значений в python json.dumps? - PullRequest
0 голосов
/ 14 марта 2019

Используя json.dumps, я получаю следующий вывод.

{
"1": {
    "fooBar": {
        "_foo": "foo",
        "_bar": "bar",
        "_id": "1"

    },
    "longValueList": [
        [
            1,
            2,
            ...
            n,

        ],
...

Приведенный выше вывод генерируется с использованием этой функции объекта класса.

def toJSON(self):
    return json.dumps(self._container, default=lambda o: o.__dict__,
                      sort_keys=True, indent=4)

Клавиша longValueList связана с действительно длинным списком значений, и мне не нужно, чтобы он печатался при выполнении этих специфических отпечатков json. Как можно запретить python json.dumps печатать ключ и значения? Просматривая документацию по python json.dumps, я не увидел никаких опций в конструкторе, которые пропускают определенные ключи по имени при вызове json.dumps

1 Ответ

0 голосов
/ 14 марта 2019

Вы можете создать временную копию и удалить из нее следующие ключи:

from functools import reduce
import operator as op

def toJSON(self, skip=()):
    obj = self._container.copy()
    for path in skip:
        del reduce(op.getitem, path[:-1], obj)[path[-1]]
    return json.dumps(obj, default=lambda o: o.__dict__,
                      sort_keys=True, indent=4)

Затем вы можете указать ключи как путь:

foo.toJSON(skip=[('1', 'longValueList')])

Это также работает с индексами списка:

foo.toJSON(skip=[('1', 'longValueList', 2)])

В качестве модификации вы также можете использовать разделители пути, например (не работает с индексами списков):

from functools import reduce
import operator as op

def toJSON(self, skip=()):
    obj = self._container.copy()
    for path in skip:
        path = path.split('/')
        del reduce(op.getitem, path[:-1], obj)[path[-1]]
    return json.dumps(obj, default=lambda o: o.__dict__,
                      sort_keys=True, indent=4)

foo.toJSON(skip=['1/longValueList'])
...