この回答によると、JSON文字列の改行は常にエスケープする必要があります。JSONをでロードする場合、これは必要ないようjson.load()
です。
次の文字列をファイルに保存しました:
{'text': 'Hello,\n How are you?'}
JSONをロードしjson.load()
ても、\n
エスケープされていなくても例外はスローされません。
>>> with open('test.json', 'r') as f:
... json.load(f)
...
{'text': 'Hello,\n How are you?'}
ただし、を使用するjson.loads()
と、例外が発生します。
>>> s
'{"text": "Hello,\n How are you?"}'
>>> json.loads(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python34\lib\json\__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "c:\Python34\lib\json\decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\Python34\lib\json\decoder.py", line 359, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 17 (char 16)
私の質問:
json.load()
自動的にエスケープ\n
ファイルオブジェクト内の?\\n
JSONが読み取られるかどうかに関係なく、常に実行する必要がありますjson.load()
かjson.loads()
?json.load()
ファイル記述子からjson.loads()
読み取り、文字列から読み取ります。
ファイル内では、\n
は改行文字として適切にエンコードされており、文字列には2文字として表示されませんが、正しい空白文字として表示されます。
しかし、文字列内で、ダブルエスケープしない場合\\n
、ローダーはそれが制御文字であると見なします。ただし、改行はJSONの制御シーケンスではありません(改行は実際には他の文字と同じです)。
バックスラッシュを2倍にすると、実際には実際の文字列が含ま\n
れ、Pythonは\n
を改行文字に変換します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加