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


问题内容

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

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

我想查看所有以十六进制而不是十进制打印的整数。那可能吗?似乎无法覆盖现有的整数编码器。您只能为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))

谢谢您的帮助。我意识到我最终会根据标准命令做出命令,但是它仅用于打印,因此可以满足我的需要。


问题答案:

一种可能的方法是拥有一个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)

输出:

{
    "a": "0x1", 
    "c": "0x3", 
    "b": 2.0
}

请注意,此初步实现不适用于列表,但是可以轻松更改。

有些人可能认为这种方法会占用大量内存,因为它会创建原始数据的副本。可能是这种情况,但是如果您的数据结构太大,那么您应该(a)不使用JSON,或(b)在工作目录中创建JSON模块的副本并根据需要进行调整。

干杯。