2016-11-15 19 views
0

最終的にファイルに保存する必要があるJSON構造を作成していますが、埋め込み改行文字に問題があります。改行文字を含む文字列を含むdictからJSONドキュメントを作成できません

私が最初に辞書を作成します。

changes = { 
    "20161101": "Added logging", 
    "20161027": "Fixed scrolling bug", 
    "20161024": "Added summary functionality" 
} 

して、単一改行区切りの文字列に変換します、これまでのところ

changes_str = '\n'.join([ "{0} - {1}".format(x, y) for x, y in changes.items() ]) 
print changes_str 
'20161101 - Added logging\n20161027 - Fixed scrolling bug\n20161024 - Added summary functionality' 

とても良いです。

changes_str_json_str = '{ "version": 1.1, "changes": "' + changes_str + '" }' 
print changes_str_json_str 
'{ "version": 1.1, "changes": 20161101 - Added logging\n20161027 - Fixed scrolling bug\n20161024 - Added summary functionality }' 

が、私は、この使用して負荷からJSONオブジェクトをエンコード/作成するために来るとき、私は問題を打つ:今私は(実際にテキストテンプレートから来ることになる)文字列にそれを追加

json_obj = json.loads(changes_str_json_str) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/python2.7/json/__init__.py", line 339, in loads 
    return _default_decoder.decode(s) 
    File "/opt/python2.7/json/decoder.py", line 364, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/opt/python2.7/json/decoder.py", line 380, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Invalid control character at: line 1 column 55 (char 54) 

改行を別の文字に変更すると、問題がどこにあるのかがはっきりとわかりますが、最終的にファイルのデータをこのようにフォーマットする必要があるため、文字を改行する必要があります(ファイルは私が知る限り、改行はJSON文字列でサポートされている文字です。

ここで問題となるものは何ですか?どうすれば回避できますか?辞書のpythonで文字列JSONをロードするには

import json 
changes_str = json.dumps(changes) 

:シングル改行区切りの文字列に変換し

答えて

1

\n。あなたが適切にバックスラッシュで改行文字をエスケープする場合

>>> import json 
>>> json.loads('"foo\nbar"') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\python35\lib\json\__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "C:\python35\lib\json\decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\python35\lib\json\decoder.py", line 355, in raw_decode 
    obj, end = self.scan_once(s, idx) 
json.decoder.JSONDecodeError: Invalid control character at: line 1 column 5 (char 4) 

それが期待どおりに動作します:

>>> json.loads('"foo\\nbar"') 
'foo\nbar' 

だから、あなたは以下のようにして、あなたのコードを修正することができます:ここでは、現在起こっていることの一例です

changes_str = '\\n'.join([ "{0} - {1}".format(x, y) for x, y in changes.items() ]) 

出力するオブジェクトを最初に構築してからdumpsを使用すると、escを心配する必要がなくなりますまったくアピール:

obj = { 
    'version': 1.1, 
    'changes': changes_str 
} 
changes_str_json_str = json.dumps(obj) 
0

あなたが適切含む制御文字をエスケープする必要がJSONで

dict_changes = json.loads(changes_str) 
+0

これは実際には問題にはなりません。たとえば、 'dict_changes = json.loads( '{" message ":" hello \ nworld "}')'を実行すると、 '無効な制御文字 'エラーが発生します。 http://www.json.org/は、 '\ n'が文字列内にある有効な文字であることを示します。 –

+0

JSONページを再読みするには、実際には '\ n 'の後ろに' n n'が付いていることがわかります。これはおそらく私の質問の根源です。 –

関連する問題