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

11

タブは、値の外側の空白を区切るものとして正当ですが、文字列内ではそうではありません。\tJSON 文字列内のタブを取得するには、代わりにシーケンスを使用する必要があります。

ただし、複数レベルの解釈に注意してください。更新からのこの Python 文字列:

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

は有効な JSON ではありません\t。JSON プロセッサが認識する前に、Python インタープリターがそのシーケンスを実際のタブ文字に変換するためです。

\tバックスラッシュを二重にすることで、タブ文字の代わりにリテラルを文字列に入れるように Python に指示できます。

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 ファイルの値に (空白としてではなく)タブを含めることができますjsonPython2.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: Config file is not valid JSON or YAML. これは、snakemake のバグだと思います。しかし、私は間違っている可能性があります。コメントしてください。すべてのタブをスペースに置き換えた後、エラー メッセージは表示されなくなりました。

于 2016-08-26T16:54:02.753 に答える