programing

Python json.loads가 'ValueError:잘못된 컨트롤 문자: 1행 33(char 33)'

yellowcard 2023. 3. 21. 21:50
반응형

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

반응형