【发布时间】:2017-07-21 07:12:57
【问题描述】:
我有一个字符串流,我需要分析每个字符串并检查它是否是有效的 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。
【问题讨论】:
-
我非常怀疑开销在于捕获异常,而是首先尝试解析字符串。
-
正如@Danield 指出的那样,try/except 处理在 Python 中相对便宜。检查一个字符串是否是有效的 JSON 然后转换它可能比你正在做的要慢。但是,如果无效的都以相同的方式损坏,您也许可以避免尝试使用
loads()转换它们,前提是检查该条件的方法非常快。 -
@DanielRoseman 虽然 try-except 子句在没有引发异常时实际上是免费的,但否则代价高昂(例如stackoverflow.com/a/2522013/4369617)。由于我每天必须处理数亿个字符串,这成为一种负担。
-
@marineau 有趣的方法。我会分析最常见的异常原因是什么,并相应地检查它们????????
标签: python json performance parsing exception