2017-03-01 95 views
1

我有一串字符串,我需要分析每个字符串并检查它是否是有效的JSON。 的Python的方式(EAFP)规定是这样的:检查字符串是否为JSON而不引发异常?

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

的问题是,字符串显著数量并不JSONs,并通过这个代码提出的许多异常缓慢的过程颇有几分。

我正在寻找一些方法来尝试和解析文本为JSON,返回某种预先定义的值(例如一个空的tuple()),指示该字符串不是JSON兼容的。 如果这是最简单的解决方案,我并不介意在标准的json软件包(重写一个或两个函数..)时进行黑客攻击。

有什么建议吗?

+6

我非常怀疑开销是捕捉异常,而是试图首先解析字符串。 –

+0

正如@Danield所指出的,除Python之外的处理相对便宜。检查一个字符串是否有效JSON然后转换它可能比你所做的要慢。但是,如果无效数据全部以相同的方式被破坏,那么如果检查该条件的方法非常快,您可以避免尝试使用'loads()'来转换它们。 – martineau

+0

@DanielRoseman而try-except子句几乎是免费的,但不会产生任何例外情况,但成本较高(例如http://stackoverflow.com/a/2522013/4369617)。由于我每天必须处理数以亿计的字符串,这成为一种负担。 – redlus

回答

-3

如果字符串是JSON,它应该以“{”开头并以“}”结尾。

我想你可以先检查字符串是否以“{”开头;如果没有,你肯定知道这是一个简单的字符串;如果它以“{”开头,则可以解析它并使用try/except(只是为了确保它不仅仅是一个以“{”开头的简单字符串)。

+1

并非所有有效的JSON值都是对象。 – chepner

0

速度问题,您可以使用多来加快分析,例如利用5名工人在多处理您解析5串在一个时间,而不是一个

如果我没有理解问题的第二部分,为自定义异常做这样的事情来获得不同的错误自定义错误由JSON返回:

def parse_json(string): 
    try: 
     return json.loads(string) 
    except exception1 as ex1: 
     print(ex1) 
     return string 
    except exception2 as ex2: 
     print(ex2) 
     return string 
    exc.... 

,或者如果你不想得到错误引发任何异常这样做,只要给它一通什么都不做,不出现任何东西:

def parse_json(string): 

try: 
    return json.loads(string) 
except exception1 as ex1: 
    pass 
+0

多重/分布式处理是一个选项,但它不会减少额外处理异常的时间,这是我想要卸载的。理想情况下,我希望json.loads()函数在解析失败而不是引发异常时返回预定义的值。 – redlus

相关问题