读取JSON并将键转换为int



众所周知,json将dict的整数键转换为字符串:

import json
print json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}

在加载回整数键时,恢复整数键最干净的方法是什么?

d = json.loads('{"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}')
print d
# {u'1': [2.5, 2.5, 2.5], u'2': [3, 3, 3, 3]}

我在想:

d = {int(k): d[k] for k in d}

但是,有没有一种更干净的方法可以用JSON/Python处理带有整数键的字典,而不需要后验键转换?

使用object_hook定义自定义函数并执行操作:

import json
def keystoint(x):
return {int(k): v for k, v in x.items()}
j = json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}
print(json.loads(j, object_hook=keystoint))
# {1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]}

来自文档:

object_hook是一个可选函数,将使用任何对象文字解码的结果(dict(。返回值将使用CCD_ 4的而不是dict。


或者,您也可以使用object_pairs_hook,它可以让您遍历对并保存.items()调用(谢谢@chepner(:

import json
def keystoint(x):
return {int(k): v for k, v in x}
j = json.dumps({1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]})
# {"1": [2.5, 2.5, 2.5], "2": [3, 3, 3, 3]}
print(json.loads(j, object_pairs_hook=keystoint))
# {1: [2.5, 2.5, 2.5], 2: [3, 3, 3, 3]}

来自文档:

object_pairs_hook是一个可选函数,将使用使用对的有序列表解码的任何对象文字的结果。将使用object_pairs_hook的返回值,而不是格言。

如果您有一个嵌套字典,我还想添加另一个解决方案。


我在另一个问题下看到了这个解决方案,该问题处理普通字典和嵌套字典,如果第二层中有非整数键,则会出现错误。

>>> import json
>>> json_data = '{"1": "one", "2": {"-3": "minus three", "4": "four"}}'
>>> py_dict = json.loads(json_data, object_hook=lambda d: {int(k) 
if k.lstrip('-').isdigit() else k: v for k, v in d.items()})
>>> py_dict
{1: 'one', 2: {-3: 'minus three', 4: 'four'}}

正如我们所看到的,object_hook用于解决问题,lstrip('-'(也用于处理负值。

最新更新