我如何使json.loads将str转换为int

时间:2015-07-30 16:14:27

标签: python json

我需要'-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

2 个答案:

答案 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}
相关问题