众所周知,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处理带有整数键的字典,而不需要后代转换键?
答案 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)
如果您有嵌套的字典,我也想添加另一个解决方案。
>>> 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('-')也用于处理负值。