要加载json,我使用带有json.loads()
块的try/except
方法来获取失败时发生错误的位置。
我收到错误,格式为:
Expecting object: line 1 column 14117248 (char 14117247)
我问是否有办法让这个错误指向行/字符。
python中是否有一种从字符串返回line X column Y
的方法?
答案 0 :(得分:2)
最有可能的,没有。至少在Python 2.7中。 loads
没有提供任何方法来自定义错误的行为方式。
try:
value, end = scan_once(s, end)
except StopIteration:
raise ValueError(errmsg("Expecting object", s, end))
但您可以从错误消息中解析位置以从输入中读取该行。错误格式可以是{0}: line {1} column {2} (char {3})
或{0}: line {1} column {2} - line {3} column {4} (char {5} - {6})
。
答案 1 :(得分:2)
从Python 3.5开始,解码可以提升JSONDecodeError
exception。此异常包含一些额外属性,使用这些属性打印出一些上下文。我将此限制为一个小字符串。您的示例输入字符串在第一行至少有14117247个字符,可能是因为您的输入根本不包含行分隔符;打印所有这些字符可能没有任何帮助:
import json
try:
json.loads(some_string)
except json.JSONDecodeError as err:
# grab a reasonable section, say 40 characters.
start, stop = max(0, err.pos - 20), err.pos + 20
snippet = err.doc[start, stop]
if err.pos < 20:
snippet = '... ' + snippet
if err.pos + 20 < len(err.doc):
snippet += ' ...'
print(err)
print(snippet)
在Python 3.4及更早版本中,引发了ValueError
异常。您可以解析消息(exception.args[0]
值)以获取线索,但这需要手动字符串解析。见errmsg()
function;解析时反转其格式。
对于这种特殊情况(预计会有值),您需要3.4或更新才能获得行和列指示符;在3.4之前,模块可以做的最好的事情是给你无益的消息No JSON object could be decoded。