查找无效JSON的相对行号

时间:2017-05-18 02:58:32

标签: python-3.x simplejson

我试图使用simplejson python库解码特定的JSON字符串。

invalid_json = """
{
  "numbers": [
    1,
    2
    3
  ],
  "boolean": true,
  "null": null,
  "number": 123,
  "object": {
    "a": "b",
    "c": "d",
    "e": "f"
  },
  "string": "Hello World"
}

"""

print(json.dumps(json.loads(invalid_json), indent=4 * ' '))

我通过删除numbers在字符串中的,数组中引发了错误。当它按照documentation失败时,它会给我一个相对于pos失败的行号。行号始终取决于存储数据的文件。

错误消息

simplejson.scanner.JSONDecodeError: Expecting ',' delimiter or ']': line 6 column 5 (char 35)

由于数字数组中的2之后没有,,因此它开始将从0开始的行计数到文件的顶部。在这种情况下,它是6(我在上面的粘贴代码中排除了新行和import语句。)

有没有办法获取相对于字符串而不是整个文件的行号?

1 个答案:

答案 0 :(得分:0)

行号是相对于不是文件的字符串。你可以通过在sting定义之前在源代码中添加空行来检查它,这不会改变错误报告的位置。

报告的行是6而不是5,这是因为解析器工作的方式是它在发现错误时报告错误,而不是在错误应该纠正的位置。 (顺便说一句,json字符串的第一行是一条零长度的行,从""""到行尾{/ p>

例如,在下面的代码中,类似于原始代码,解析器无法知道它是否有效,直到它到达第6行。在原始代码中,解析器知道只有在第6行。

valid_json = """
{
  "numbers": [
    1,
    2
    ,3
  ]
}

"""

在一般的解析错误中,错误的修复通常是在标记错误之前的几行。写入的行应该被认为不仅仅是一个提示而不是确切的位置。