23

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

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

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

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

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

4

5 回答 5

57

正确答案是:停止不想抓住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
于 2012-07-02T13:27:28.140 回答
27

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

try:
    json_object = json.loads(json_string)
except ValueError, e:
    pass # invalid json
else:
    pass # valid json
于 2012-07-02T13:21:47.213 回答
10

您是否有任何理由不想捕获异常?

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

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

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

过去,我自己在 Java 背景中一直在努力使用这种方法,但这确实是在 Python 中执行此操作的最简单方法……而且简单胜于复杂。

于 2012-07-02T13:22:18.413 回答
0

安全的函数,它还可以捕获传递类型TypeError时发生的情况None

import json

def json_loads_safe(data):
    try:
        return json.loads(data)
    except (ValueError, TypeError):
        return None
于 2021-11-12T14:03:21.953 回答
-5

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

def is_json(myjson):
    return type(myjson) == type({})

def is_json_arr(myjson):
    return type(myjson) == type([{}])
于 2017-07-05T12:36:47.433 回答