gpt4 book ai didi

Python:在不引发异常的情况下检查字符串是否为 JSON?

转载 作者:行者123 更新时间:2023-12-05 06:40:29 26 4
gpt4 key购买 nike

我有一个字符串流,我需要在其中分析每个字符串并检查它是否是有效的 JSON。pythonic 方式 ( EAFP ) 规定了这样的事情:

import json
def parse_json(string):
try:
return json.loads(string)
except:
return string

问题在于大量字符串不是 JSON,并且此代码引发的许多异常会大大减慢该过程。

我正在寻找某种方法来尝试将文本解析为 JSON,返回某种预定义值(例如空的 tuple()),表明该字符串与 JSON 不兼容。如果这是最简单的解决方案,我不介意绕过标准 json 包(覆盖一两个函数..)。

有什么建议吗?

更新:因为我只对“复杂”的 JSON(数组和对象)感兴趣,所以我最终决定使用简单的 if 来检查字符串的第一个和最后一个字符:

try:
import ujson as json
except ImportError:
import json


def parse_json(string):
if len(text) > 0:
text = text.strip()
if text != "" and ((text[0] == "{" and text[-1] == "}") or (text[0] == "[" and text[-1] == "]")):
try:
return json.loads(string)
except:
return string

ujson 是一种比 Python 的标准 json 更高效的实现。此外,跳过所有未用 [] 或 {} 包裹的字符串会大大减少异常数量。原来混合LBYL EAFP 正是我所需要的。

最佳答案

更紧凑的方式应该是这样的。 Json lib 只处理 str、bytes 或 bytearray 结构,所以只考虑它们。与 if len(text)==0 不同,if not text 对于长字符串来说要快得多,我们不想知道文本的长度。 Json 库可能引发 JsonDecoderError。可以使用正则表达式检查文本的首尾字符的反向引用,但我尝试了可能的边缘情况,例如“{]”和“[}”,它们不会失败。

def is_json(text: str) -> bool:
from json import loads, JSONDecodeError

if not isinstance(text, (str, bytes, bytearray)):
return False
if not text:
return False
text = text.strip()
if text[0] in {'{', '['} and text[-1] in {'}', ']'}:
try:
loads(text)
except (ValueError, TypeError, JSONDecodeError):
return False
else:
return True
else:
return False

编辑:我们应该检查文本是否为空,而不是引发 IndexError。

def is_json(text: str) -> bool:
if not isinstance(text, (str, bytes, bytearray)):
return False
if not text:
return False
text = text.strip()
if text:
if text[0] in {'{', '['} and text[-1] in {'}', ']'}:
try:
loads(text)
except (ValueError, TypeError, JSONDecodeError):
return False
else:
return True
else:
return False
return False

关于Python:在不引发异常的情况下检查字符串是否为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42540543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com