我需要'-40'在输出上为-40,我该怎么做?
In [2]: foo
Out[2]: '{\n\t"rssiIntentRange":"-40"\n}'
In [3]: import json
In [4]: json.loads(foo)
Out[4]: {u'rssiIntentRange': u'-40'}
我正在寻找干净和通用的东西。在json.loads之后进行处理是我已经在做的事情,并且由于所有类型的数据和索引而非常脏。如果json.loads不是最好的选择,我也可以使用其他方法来处理JSON
答案 0 :(得分:2)
如果你想影响调用json.loads()
时会发生什么,你需要写一个对象钩子:
import json
def int_please_object_hook(obj):
"""If a value in obj is a string, try to convert it to an int"""
rv = {}
for k, v in obj.items():
if isinstance(v, basestring):
try:
rv[k] = int(v)
except ValueError:
rv[k] = v
else:
rv[k] = v
return rv
j = '{"key1": "value1", "key2": "10", "key3": "-10"}'
print(json.loads(j))
# {'key1': 'value1', 'key2': '10', 'key3': '-10'}
print(json.loads(j, object_hook=int_please_object_hook))
# {'key1': 'value1', 'key2': 10, 'key3': -10}
答案 1 :(得分:0)
执行此操作的一种方法是在加载json后将-40
字符串转换为int。
示例 -
>>> foo = '{\n\t"rssiIntentRange":"-40"\n}'
>>> import json
>>> d = json.loads(foo)
>>> d['rssiIntentRange'] = int(d['rssiIntentRange'])
>>> d
{'rssiIntentRange': -40}
要更改已加载字典中的所有此类值,您可以执行 -
d = json.loads(foo)
for k,v in d.items():
try:
d[k] = int(v)
except (ValueError, TypeError):
pass
示例/演示 -
>>> foo = '{\n\t"rssiIntentRange":"-40",\n\t"blah":"abcd",\n\t"anothernumber":"-10"\n}'
>>> d = json.loads(foo)
>>> for k,v in d.items():
... try:
... d[k] = int(v)
... except (ValueError, TypeError):
... pass
...
>>> d
{'blah': 'abcd', 'anothernumber': -10, 'rssiIntentRange': -40}