【问题标题】:Python loads None to Json without emitting errorPython将None加载到Json而不会发出错误
【发布时间】:2018-05-31 00:41:40
【问题描述】:

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

如果没有dict,问题是返回None

示例代码:

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() 应该可以解决问题,但它调用了类但不调用默认方法。

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

【问题讨论】:

  • 不,data2,应该是'null',因为你json.loads它。
  • data2 是传感器的原始变量。它要么以json 形式的字符串形式出现,格式与data1 相同,要么根本不出现,因此它是None。它永远不会像'null'

标签: python json nonetype


【解决方案1】:

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

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

如果obj 不是 None,这将返回json.loads(obj),否则将返回None。或者我们可以构造一个“尽力而为”的 JSON 加载,旨在 json.loads 字符串,或者在失败的情况下返回 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': nonesafe_loads(data1),
          'data2': nonesafe_loads(data2)}
output = json.dumps(sensor)

【讨论】:

  • @ZeroPiraeus:也可能是ValueError,因为我们可能已经有一个非JSON字符串,比如blablabla,然后我们想省略反序列化。
  • @ZeroPiraeus:在 Python-2.x 中没有 ValueError,括号确实丢失了 :)
猜你喜欢
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多