37

加载似乎包含TAB字符的 JSON 文件时,我遇到了解析问题。

当我去http://jsonlint.com/时,我输入带有 TAB 字符的部分:

{
    "My_String": "Foo bar.  Bar foo."
}

验证者抱怨:

Parse error on line 2:
{    "My_String": "Foo bar. Bar foo."
------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['

这实际上是有问题的 JSON 文本的复制/粘贴。

我试过加载这个文件,有json没有simplejson成功。我怎样才能正确加载它?我应该只预处理文件并将 TAB 替换\t为空格还是空格?或者我在这里缺少什么?

更新:

这也是一个有问题的例子simplejson

foo = '{"My_string": "Foo bar.\t Bar foo."}'
simplejson.loads(foo)

JSONDecodeError: Invalid control character '\t' at: line 1 column 24 (char 23)
4

5 回答 5

53

JSON 标准

在任何标记之前或之后都允许使用无关紧要的空格。空白字符有:字符制表符(U+0009)、换行符(U+000A)、回车符(U+000D)和空格符(U+0020)。任何标记中都不允许使用空格,但字符串中允许使用空格。

这意味着 JSON 字符串中不允许使用文字制表符。您需要将其转义为\t (在 .json 文件中)

{"My_string": "Foo bar.\t Bar foo."}

此外,如果在 Python 字符串文字中提供了 json 文本,那么您需要对选项卡进行双重转义:

foo = '{"My_string": "Foo bar.\\t Bar foo."}' # in a Python source

或者使用 Python 原始字符串文字:

foo = r'{"My_string": "Foo bar.\t Bar foo."}' # in a Python source
于 2013-11-05T21:29:07.027 回答
11

制表符在值之外作为分隔空白是合法的,但在字符串内则不是。要在 JSON 字符串中获取选项卡,您需要改用序列\t

但要注意多层次的解释。您更新中的这个 Python 字符串:

foo = '{"My_string": "Foo bar.\t Bar foo."}'

不是有效的 JSON,因为 Python 解释器会\t在 JSON 处理器看到之前将该序列转换为实际的制表符。

您可以通过加倍反斜杠来告诉 Python 在字符串中放入文字\t而不是制表符:

foo = '{"My_string": "Foo bar.\\t Bar foo."}'

或者您可以使用“原始”字符串语法,它不会解释任何特殊的反斜杠序列:

foo = r'{"My_string": "Foo bar.\t Bar foo."}'

无论哪种方式,JSON 处理器都会看到一个包含反斜杠后跟“t”的字符串,而不是包含制表符的字符串。

于 2013-11-05T21:10:39.647 回答
5

您可以通过转义 JSON 文件中的值(而不是空格)来包含制表符。json这是Python2.7中模块的一个工作示例:

>>> import json
>>> obj = json.loads('{"MY_STRING": "Foo\\tBar"}')
>>> obj['MY_STRING']
u'Foo\tBar'
>>> print obj['MY_STRING']
Foo    Bar

虽然不逃避'\t'导致错误:

>>> json.loads('{"MY_STRING": "Foo\tBar"}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 19 (char 18)
于 2013-11-05T21:16:29.110 回答
0

只是分享一下我的经验:

我正在使用snakemake和一个用Json编写的配置文件。json 文件中有用于缩进的制表符。为此目的,TAB 是合法的。但我收到错误消息:snakemake.exceptions.WorkflowError:配置文件不是有效的 JSON 或 YAML。我相信这是snakemake的错误;但我可能是错的。请评论。用空格替换所有 TAB 后,错误消息消失了。

于 2016-08-26T16:54:02.753 回答
0

在节点红色流中,我面临相同类型的问题:

flow.set("delimiter",'"\t"');

错误:

{ "status": "ERROR", "result": "Cannot parse config: String: 1: in value for key 'delimiter': JSON does not allow unescaped tab in quoted strings, use a backslash escape" }  

解决方案:

我只是\\t在代码中添加了。

 flow.set("delimiter",'"\\t"');
于 2016-11-04T14:07:26.260 回答