2013-07-29 57 views
1

我从数据库中读取JSON并使用python解析它。跳过破碎的jsons python

cur1.execute("Select JSON from t1") 
dataJSON = cur1.fetchall() 
for row in dataJSON: 
jsonparse = json.loads(row) 

问题是我正在阅读的一些JSON文件已损坏。 我想我的程序跳过JSON,如果它不是一个有效的JSON,并且它然后继续解析它。现在我的程序一旦遇到一个破碎的json就会崩溃。 T1有几个JSON,我正在逐一阅读。

+0

什么是你得到的例外?我不是Python开发人员,但我假设你可以将你的jsonparse语句封装在try-catch语句中,以便在引发异常(用于错误的json解析)时继续执行循环。 – noname

回答

3

更新

你得到一个期待字符串或缓冲区 - 你需要使用行[0]的结果将是1元组......你要采取的第一个也是唯一柱。

如果你确实想检查坏JSON

你可以把一个try /除了它周围:

for row in dataJSON: 
    try: 
     jsonparse = json.loads(row) 
    except Exception as e: 
     pass 

现在 - 而不是如上使用Exception - 使用异常的类型这是目前发生的,这样你就不会捕获非json负载相关的错误...(这可能是ValueError

+0

谢谢..我得到一个“预期的字符串或缓冲区”异常 – Ank

+0

@Ankur这里是我尝试'json.loads('{')' - >'ValueError:期望对象:第1行0(char 0)' - 所以给你'ValueError',这将是你想要使用的,而不是'Exception' - 否则你将会捕捉到太多的例外 –

+0

@Ankur取决于你的数据是如何“破碎”的 - 你也可以考虑第三方https://pypi.python.org/pypi/demjson模块 - 它有一个稍微宽松的解析器,(比如名称不需要被引用等等),所以它有可能解决一些事情更严格的解析器不能,然后你可以忽略其余的... –

1

如果你只是想默默地忽略错误,你可以换成json.loads在一个try..except块:

try: jsonparse = json.loads(row) 
except: pass 
+1

这将默默地掩盖*所有*错误 - 诸如'jsonparse = josn.loads(row)'之类的东西也会失败... –

+0

@JonClements虽然我同意,但您必须专门检查ValueError(ValueError除外e')。仅供参考:'NameError'也是一个'Exception',所以你的答案遭遇同样的问题 – SheetJS

+0

我的答案是一个模板,解释了不使用'Exception'以及如何找到一个使用 - 并继续提到它可能是“ValueError”是需要的......但我不是没有通过模块代码和OP的数据,知道他们遇到了哪些异常...... –