Python json.loads가 'ValueError:잘못된 컨트롤 문자: 1행 33(char 33)'
나는 다음과 같은 끈이 있다.
s = u"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}"""
json.loads(s)
는 다음과 같은 오류 메시지를 반환합니다.
ValueError: Invalid control character at: line 1 column 33 (char 33)
이 에러가 발생하는 이유는 무엇입니까?어떻게 하면 이 문제를 해결할 수 있을까요?
또 다른 선택지는 아마도,strict=False
논쟁
http://docs.python.org/2/library/json.html에 따르면
strict가 False(True가 기본값)인 경우 문자열 안에 제어 문자를 사용할 수 있습니다.이 컨텍스트의 제어 문자는 '\t'(탭), '\n', '\r', '\0' 등 0~31 범위의 문자 코드를 가진 문자입니다.
예를 들어 다음과 같습니다.
json.loads(json_str, strict=False)
문제는 유니코드 문자열에 캐리지 리턴이 포함되어 있다는 것입니다.\r
및 줄바꿈(\n
)는, JSON 데이터의 문자열 리터럴내에 있습니다.스트링 자체의 일부인 경우 적절히 이스케이프해야 합니다.스트링의 일부가 아닌 경우 JSON에도 포함되어 있지 않아야 합니다.
유효한 JSON을 생성하기 위해 이 JSON 문자열을 가져온 위치를 수정할 수 없는 경우 문제 문자를 제거할 수 있습니다.
>>> json.loads(s.replace('\r\n', ''))
또는 수동으로 이스케이프합니다.
>>> json.loads(s.replace('\r\n', '\\r\\n'))
문제는 인덱스 33의 문자가 캐리지 리턴 컨트롤 문자라는 것입니다.
>>> s[33]
u'\r'
JSON 사양에 따라 유효한 문자는 다음과 같습니다.
다음을 제외한 모든 유니코드 문자:
"
,\
, 및 컨트롤 서포트(ord(char) < 32
).다음 문자 시퀀스를 사용할 수 있습니다.
\"
,\\
,\/
,\b
(백스페이스),\f
(폼 피드),\n
(라인 피드/새 라인),\r
(반환율),\t
(탭), 또는\u
그 뒤에 4자리 16진수가 이어집니다.
그러나 Python에서는 제어 문자를 해석할 수 있기 때문에 (문자열이 raw가 아닌 한) 이중 이스케이프 제어 문자를 사용해야 합니다.
>>> s = ur"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}"""
>>> json.loads(s)
{u'desc': u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br />\r\nhttp://www.zhenpin.com/ <br />\r\n<br />\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026'}
참고 자료:
도망치려고 노력해라\n
그리고.\r
:
s = s.replace('\r', '\\r').replace('\n', '\\n')
json.loads(s)
>>> {u'desc': u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br />\r\nhttp://www.zhenpin.com/ <br />\r\n<br />\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026'}
파일에 실제로 공백이 있는 문자열이 포함되어 있는 경우 이 오류가 발생할 수 있습니다.공백을 삭제하면 문제가 해결됩니다.
언급URL : https://stackoverflow.com/questions/9295439/python-json-loads-fails-with-valueerror-invalid-control-character-at-line-1-c
'programing' 카테고리의 다른 글
JSX 내부의 React에서 숫자를 루프오버하는 방법 (0) | 2023.03.21 |
---|---|
다른 옵션 파라미터는 생략한 채 옵션 파라미터를 전달하려면 어떻게 해야 합니까? (0) | 2023.03.21 |
순환 참조가 데이터베이스에서 허용됩니까? (0) | 2023.03.21 |
angular.copy를 사용하는 이유와 시기(Deep Copy) (0) | 2023.03.21 |
비동기 컨스트럭터가 TypeScript에서 기능합니까? (0) | 2023.03.21 |