Python 将 None 加载到 Json 而不会发出错误

Python loads None to Json without emitting error

我正在将字典解析为嵌套的 Json (Python 2.7)。我遇到的问题是有时变量没有值,所以它需要 None,这取决于变量是否出现。没关系,但我想避免在引号前使用转义字符。在嵌套 Json 之前,我执行 json.loads() 来删除字符串转义。

问题是return None如果没有dict

示例代码:

import json

data1 = '{"foo":"bar"}'
data2 = None
sensor = {'header':'Info',
          'data1': json.loads(data1),
          'data2': json.loads(data2)}
output = json.dumps(sensor)
print(output)

预期结果:

{"data2": null, "data1": {"foo": "bar"}, "header": "Info"}

收到错误:

Traceback (most recent call last):
  File "\jsonDecoding.py", line 7, in <module>
    'data2': json.loads(data2)}
  File "\Python\Python35\lib\json\__init__.py", line 312, in loads
    s.__class__.__name__))
TypeError: the JSON object must be str, not 'NoneType'

尝试过的解决方案:

class Decoder(json.JSONDecoder):
    def default(self, obj):
        if obj is None::
            return None
        else: return super(Decoder, self).default(obj)

data1 = '{"foo":"bar"}'
data2 = None
sensor = {'header':'Info',
          'data1': json.loads(data1),
          'data2': json.loads(data2, cls=Decoder)}
output = json.dumps(sensor)

我认为实施 Decoder.default() 应该可以解决问题,但它会调用 class 但不会调用默认方法。

有很多关于 None 代替 keyvalue 的讨论,但我没有找到代替整个对象

我认为你让问题变得更难了。我们可以构造一个 None 安全函数:

def nonesafe_loads(obj):
    if obj is not None:
        return json.loads(obj)

这将 return json.loads(obj) 如果 obj 而不是 None,否则它将 return None。或者我们可以构造一个 "best effort" JSON 负载,旨在 json.loads 字符串,或者在失败的情况下,return 是 obj 本身:

def besteffort_loads(obj):
    try:
        return json.loads(obj)
    except (TypeError, ValueError):
        return obj

现在我们可以在程序中使用我们的 nonesafe_loads:

data1 = '{"foo":"bar"}'
data2 = None
sensor = {'header':'Info',
          'data1': <b>nonesafe_loads(</b>data1<b>)</b>,
          'data2': <b>nonesafe_loads(</b>data2<b>)</b>}
output = json.dumps(sensor)