读取JSON并将密钥转换为int

时间:2018-10-29 17:01:57

标签: python json dictionary

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

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处理带有整数键的字典,而不需要后代转换键?

2 个答案:

答案 0 :(得分:3)

使用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]}

来自docs

  

object_hook是一个可选函数,将与   解码的任何对象文字的结果(dict)。返回值   将使用object_hook中的来代替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将代替   dict。

答案 1 :(得分:1)

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


我见过this solution,是在另一个问题下,该问题处理普通字典,还有嵌套字典,如果第二层中有非整数键,则会出错。

>>> 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('-')也用于处理负值。