如何使用Python中的json.dumps()将整数打印为十六进制字符串

Pla*_*oth 6 python hex json integer

目前我使用以下代码来打印大型数据结构

print(json.dumps(data, indent=4))
Run Code Online (Sandbox Code Playgroud)

我想看到以十六进制而不是十进制打印的所有整数.那可能吗?似乎没有办法覆盖现有的整数编码器.您只能为尚未由JSONEncoder类处理的类型提供默认值,但无法覆盖它对整数进行编码的方式.

我想我可以使用sys.displayhook覆盖默认的整数打印行为,如果我在命令行中运行但我不是.

仅供参考,数据结构是一个混合包,包括词典,列表,字符串,整数等.所以这就是我使用json.dumps()的原因.我能想到的另一种方法就是自己解析它然后我会重写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))
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.我意识到我最终会从一个标准的dict中做出一个冒险,但它只是用于打印,所以它对我需要的东西很好.

Esc*_*alo 2

一种可能的方法是使用一个函数,它可以动态serialize生成字典的副本,并使用标准模块转储字符串。初步实施如下:json

import json

def serialize(data):
    _data = {}
    for k, v in data.items():
        if isinstance(v, int):
            _data[k] = hex(v)
        else:
            _data[k] = v
    return json.dumps(_data, indent=4)


if __name__ == "__main__":
    data = {"a":1, "b":2.0, "c":3}
    print serialize(data)
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "a": "0x1", 
    "c": "0x3", 
    "b": 2.0
}
Run Code Online (Sandbox Code Playgroud)

请注意,此初步实现不适用于列表,但这很容易更改。

有些人可能会声称该方法是内存密集型的,因为它创建了原始数据的副本。情况可能是这样,但如果您的数据结构那么大,那么也许您应该 (a) 不使用 JSON,或者 (b) 在工作目录中创建 JSON 模块的副本并根据您的需要进行定制。

干杯。