2016-11-15 10 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' 

지금까지. 지금은 문자열로 추가 (현실에있는 텍스트 템플릿에서 온 것입니다) :

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) 
:

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 문자열에서 지원되는 문자입니다.

여기 정확히 어떤 문제가 있으며 어떻게 해결할 수 있습니까?

import json 
changes_str = json.dumps(changes) 

DICT 파이썬에서 문자열 JSON을로드하려면 : 단일 라인 피드로 변환

답변

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'이 아니라 내 질문의 루트 일 것입니다. –