我想知道是否有一种方法可以使用json.loads
来自动将空字符串转换为其他内容,例如None
。
例如,给定:
data = json.loads('{"foo":"5", "bar":""}')
我想要:
data = {"foo":"5", "bar":None}
代替:
data = {"foo":"5", "bar":""}
答案 0 :(得分:3)
您可以使用字典理解:
data = json.loads('{"foo":"5", "bar":""}')
res = {k: v if v != '' else None for k, v in data.items()}
{'foo': '5', 'bar': None}
这只会处理嵌套字典的第一级。您可以使用递归函数来处理更广义的嵌套字典情况:
def updater(d, inval, outval):
for k, v in d.items():
if isinstance(v, dict):
updater(d[k], inval, outval)
else:
if v == '':
d[k] = None
return d
data = json.loads('{"foo":"5", "bar":"", "nested": {"test": "", "test2": "5"}}')
res = updater(data, '', None)
{'foo': '5', 'bar': None,
'nested': {'test': None, 'test2': '5'}}
答案 1 :(得分:3)
您也可以使用json.loads
object_hook
参数来完成此操作。例如:
import json
import six
def empty_string2none(obj):
for k, v in six.iteritems(obj):
if v == '':
obj[k] = None
return obj
print(json.loads('{"foo":"5", "bar":"", "hello": {"world": ""}}',
object_hook=empty_string2none))
这将打印
{'foo': '5', 'bar': None, 'hello': {'world': None}}
这样,您无需进行其他递归。
答案 2 :(得分:0)
我做了一些反复试验,无法使用
None
将json.loads()
解析为字符串,您将必须像本例中一样使用json.loads() with json.dumps()
:
import json
data = json.loads('{"foo":"5", "bar":"%r"}' %(None))
data2 = json.loads(json.dumps({'foo': 5, 'bar': None}))
if data2['bar'] is None:
print('worked')
print(data['bar'])
else:
print('did not work')