【问题标题】:Verify if a String is JSON in python?在python中验证字符串是否为JSON?
【发布时间】:2012-07-02 22:02:16
【问题描述】:

我在 Python 中有一个字符串,我想知道它是否是有效的 JSON。

json.loads(mystring) 如果字符串不是 JSON,则会引发错误,但我不想捕获异常。

我想要这样的东西,但它不起作用:

if type(mysrting) == dict:
    myStrAfterLoading = json.loads(mystring)
else:
    print "invalid json passed"

我是否必须捕获该 ValueError 才能查看我的字符串是否为 JSON?

【问题讨论】:

  • "...但我不想捕获异常。我想使用 if,else..." 释义:"我不想走简单、明显的方式。我想在一种行不通的方法。”无意冒犯,纯属开玩笑! :)
  • 不,我对所有应用程序都有一个异常包装器。这应该捕捉真正的错误。如果我可以使用 if/else,我更喜欢它..
  • 我不明白这个论点。你可以在 try/except 中使用 try/except 没有任何问题。

标签: python json dictionary


【解决方案1】:

正确答案是:别再想赶上ValueError了。

如果字符串是有效的 json,则 Python 脚本示例返回布尔值:

import json

def is_json(myjson):
    try:
        json_object = json.loads(myjson)
    except ValueError as e:
        return False
    return True

print(is_json('{}'))              # prints True
print(is_json('{asdf}'))          # prints False
print(is_json('{"age":100}'))     # prints True
print(is_json('{'age':100 }'))    # prints False
print(is_json('{"age":100 }'))    # prints True

【讨论】:

  • TypeError: the JSON object must be str, not 'Response' 收到此错误
  • 无法验证像 u'1589649418441381790' 这样的单个 unicode 字符串,有什么想法吗?
  • @lifelogger 你使用的是什么版本的 Python?我用上面的代码运行了一个交互式 python 提示符(v2.7.10),当我运行print is_json(u'1589649418441381790') 时,它打印了True。如果您使用(我相信)v2.6 或更早版本,则需要 simplejson 库
  • 如果传递了 NoneType 的对象,则会抛出 TypeError
  • Imo 你不应该让它成为从异常块/范围返回的常态。如果可能的话,我更喜欢这段代码。
     try: json_object = json.loads(value) return True except JSONDecodeError: pass return False 
【解决方案2】:

要验证字符串需要解析它 - 所以如果你检查然后转换它实际上需要两倍的时间。 捕捉异常是最好的方法。 有趣的是,您仍然可以使用 if-else 样式表达式:

try:
    json_object = json.loads(json_string)
except ValueError, e:
    pass # invalid json
else:
    pass # valid json

【讨论】:

  • python3 的 ValueError as e 除外
【解决方案3】:

你有什么不想捕获异常的原因吗?

请记住,在 Python 中测试和捕获异常可能非常快,并且通常是 Python 的做事方式,而不是测试类型(基本上,相信鸭子类型并做出相应的反应)。

为了让您更放心,请看这里: Python if vs try-except

如果您仍然担心可读性,请在代码中添加注释以解释您使用 try/except 的原因;)

过去,我自己也曾因 Java 背景而苦恼于这种方法,但这在 Python 中确实做到这一点的最简单方法......而且简单胜于复杂。

【讨论】:

  • 正如我所说,我对所有应用程序都有异常包装器。我希望它能够捕获紧急错误,以便我可以从 1 个地方处理它们。使用 if else 可以让我对代码有更多的控制权,并确保我没有因为另一个原因而除外..
  • 然后在尽可能少的代码块上执行 try/except。您可以将异常包装器保留在您的代码中,并使用 try/except 就像它的用途一样。
  • @eligro:听起来好像您认为您只能在一个地方或整个应用程序中捕获异常。这是您想要捕获特定异常的地方,因为它适合特定用例
  • +1 参考try: except的性能优势。
【解决方案4】:

最安全的函数,它也捕获TypeError,当None类型被传递时发生

import json

def json_loads_safe(data):
    try:
        return json.loads(data)
    except (ValueError, TypeError):
        return None

【讨论】:

    【解决方案5】:

    当你可以使用如下类型时为什么要解析:

    def is_json(myjson):
        return type(myjson) == type({})
    
    def is_json_arr(myjson):
        return type(myjson) == type([{}])
    

    【讨论】:

    • OP 想要测试一个字符串是否包含有效的 JSON。字符串永远不会满足type(myjson) == type({})
    猜你喜欢
    • 2012-08-03
    • 2017-06-10
    • 2011-09-29
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多