Как напечатать целые числа в виде шестнадцатеричных строк с помощью json.dumps () в Python

В настоящее время я использую следующий код для печати большой структуры данных

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

Я хотел бы видеть все целые числа, которые печатаются в шестнадцатеричном, а не в десятичном формате. Это возможно? Кажется, что нет возможности переопределить существующий кодировщик для целых чисел. Вы можете предоставить значение по умолчанию только для типов, которые еще не обрабатываются классом JSONEncoder, но не можете изменить способ кодирования целых чисел.

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

Просто для справки: структура данных представляет собой смесь слов, списков, строк, целых чисел и т. Д. Вот почему я выбрал json.дампы () . Единственный другой способ, которым я могу это сделать, - это проанализировать его сам, а затем я бы переписал модуль json.

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

def odprint(self, hexify=False):
    """pretty print the ordered dictionary"""
    def hexify_list(data):
        _data = []
        for i,v in enumerate(data):
            if isinstance(v, (int,long)):
                _data.insert(i,hex(v))
            elif isinstance(v,list):
                _data.insert(i, hexify_list(v))
            else:
                _data.insert(i, val)
        return _data

    def hexify_dict(data):
        _data = odict()
        for k,v in data.items():
            if isinstance(v, (dict,odict)):
                _data[k] = hexify_dict(v)
            elif isinstance(v, (int, long)):
                _data[k] = hex(v)
            elif isinstance(v,list):
                _data[k] = hexify_list(v)
            else:
                _data[k] = v
        return _data

    if hexify:
        print(json.dumps(hexify_dict(self), indent=4))
    else:
        print(json.dumps(self, indent=4))

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

6
задан Plazgoth 1 February 2012 в 20:34
поделиться