I'm trying to convert a string which represents a JSON object to a real JSON object using json.loads
but it doesn't convert the integers:
(in the initial string, integers are always strings)
$> python
Python 2.7.9 (default, Aug 29 2016, 16:00:38)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> c = '{"value": "42"}'
>>> json_object = json.loads(c, parse_int=int)
>>> json_object
{u'value': u'42'}
>>> json_object['value']
u'42'
>>>
Instead of {u'value': u'42'}
I'd like it becomes {u'value': 42}
. I know I can run through the whole object, but I don't want to do that, it's not really efficient to do it manually, since this parse_int
argument exists (https://docs.python.org/2/library/json.html#json.loads).
Thanks to Pierce's proposition:
Python 2.7.9 (default, Aug 29 2016, 16:00:38)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>>
>>> class Decoder(json.JSONDecoder):
... def decode(self, s):
... result = super(Decoder, self).decode(s)
... return self._decode(result)
... def _decode(self, o):
... if isinstance(o, str) or isinstance(o, unicode):
... try:
... return int(o)
... except ValueError:
... try:
... return float(o)
... except ValueError:
... return o
... elif isinstance(o, dict):
... return {k: self._decode(v) for k, v in o.items()}
... elif isinstance(o, list):
... return [self._decode(v) for v in o]
... else:
... return o
...
>>>
>>> c = '{"value": "42", "test": "lolol", "abc": "43.4", "dcf": 12, "xdf": 12.4}'
>>> json.loads(c, cls=Decoder)
{u'test': u'lolol', u'dcf': 12, u'abc': 43.4, u'value': 42, u'xdf': 12.4}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…