Python 使用json解析空字符串

Python 使用json解析空字符串,python,json,string,python-3.x,dictionary,Python,Json,String,Python 3.x,Dictionary,我想知道是否有一种方法可以使用json.loads来自动转换其他内容中的空字符串,例如None 例如,假设: data = json.loads('{"foo":"5", "bar":""}') 我希望: data = {"foo":"5", "bar":None} 而不是: data = {"foo":"5", "bar":""} 我做了一些尝试和错误,不可能使用json.loads()将None解析为字符串。您必须使用json.loads()和json.dumps(),就像我在本例中所

我想知道是否有一种方法可以使用
json.loads
来自动转换其他内容中的空字符串,例如
None

例如,假设:

data = json.loads('{"foo":"5", "bar":""}')
我希望:

data = {"foo":"5", "bar":None}
而不是:

data = {"foo":"5", "bar":""}
我做了一些尝试和错误,不可能使用
json.loads()
None
解析为字符串。您必须使用
json.loads()和json.dumps()
,就像我在本例中所做的那样:


您可以使用字典理解:

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'}}

您还可以使用
json.loads
object\u 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}}

这样,您就不需要额外的递归。

为什么?两者都是错误的,因此您可以捕获它们。在将字符串加载到json之前,您可以在字符串上尝试类似于
.replace(“\”,“None”)
的操作。
{'foo': '5', 'bar': None, 'hello': {'world': None}}