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
代替 key
或 value
的讨论,但我没有找到代替整个对象
我认为你让问题变得更难了。我们可以构造一个 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)
我正在将字典解析为嵌套的 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
代替 key
或 value
的讨论,但我没有找到代替整个对象
我认为你让问题变得更难了。我们可以构造一个 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)