programing

JSON 파일에서 TAB을 구문 분석할 수 없습니다.

lastmoon 2023. 3. 8. 21:43
반응형

JSON 파일에서 TAB을 구문 분석할 수 없습니다.

TAB 문자가 들어간 것 같은 JSON 파일을 로드할 때 해석에 문제가 있습니다.

http://jsonlint.com/,에 접속하여 TAB 문자와 함께 부품을 입력하면 다음과 같이 됩니다.

{
    "My_String": "Foo bar.  Bar foo."
}

검증자는 다음과 같이 불만을 제기합니다.

Parse error on line 2:
{    "My_String": "Foo bar. Bar foo."
------------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['

이것은 문제의 JSON 텍스트를 문자 그대로 복사/붙여넣는 것입니다.

이 파일을 로딩해 보았습니다.json그리고.simplejson성공하지 못하고어떻게 하면 제대로 장전할 수 있을까요?파일을 전처리하고 Tab을 다음으로 대체해야 합니까?\t아니면 공간인가?아니면 제가 여기서 놓치고 있는 게 있나요?

업데이트:

여기에도 문제가 있는 예가 있습니다.simplejson:

foo = '{"My_string": "Foo bar.\t Bar foo."}'
simplejson.loads(foo)

JSONDecodeError: Invalid control character '\t' at: line 1 column 24 (char 23)

JSON 표준에서:

토큰 앞 또는 뒤에는 중요하지 않은 공백이 허용됩니다.공백 문자는 문자표(U+0009), 줄바꿈(U+000A), 캐리지 리턴(U+000D) 및 공간(U+0020)입니다.문자열에 공백이 허용된다는 점을 제외하고 토큰 내에는 공백이 허용되지 않습니다.

즉, JSON 문자열에는 리터럴탭 문자를 사용할 수 없습니다.당신은 그것을 탈출할 필요가 있다.\t (.json 파일):

{"My_string": "Foo bar.\t Bar foo."}

또한 Python 문자열 리터럴 내에 json 텍스트가 제공되는 경우 탭을 이중 이스케이프해야 합니다.

foo = '{"My_string": "Foo bar.\\t Bar foo."}' # in a Python source

또는 Python raw string 리터럴을 사용합니다.

foo = r'{"My_string": "Foo bar.\t Bar foo."}' # in a Python source

탭은 값을 제외한 공백으로 구분하는 것이 합법적이지만 문자열 내에서는 구분되지 않습니다.JSON 문자열 내의 탭을 가져오려면 이 순서를 사용해야 합니다.\t대신.

그러나 다양한 수준의 해석에 주의해야 합니다.업데이트에서 다음 Python 문자열:

foo = '{"My_string": "Foo bar.\t Bar foo."}'

유효한 JSON이 아닙니다.Python 인터프리터가 이 JSON을 돌리기 때문입니다.\tJSON 프로세서가 인식하기 전에 실제 탭 문자로 시퀀스를 진행합니다.

Python에게 리터럴을 넣으라고 할 수 있습니다.\t탭 문자 대신 백슬래시를 2배로 하여 문자열에 입력합니다.

foo = '{"My_string": "Foo bar.\\t Bar foo."}'

또는 특별한 백슬래시 시퀀스를 해석하지 않는 "raw" 문자열 구문을 사용할 수도 있습니다.

foo = r'{"My_string": "Foo bar.\t Bar foo."}'

어느 쪽이든 JSON 프로세서는 탭을 포함하는 문자열이 아니라 백슬래시를 포함하는 문자열 뒤에 't'가 표시됩니다.

값을 이스케이프하여(공백 대신) 값에 을 포함할 수 있습니다.다음 예시는 다음과 같습니다.jsonPython 2.7의 모듈:

>>> import json
>>> obj = json.loads('{"MY_STRING": "Foo\\tBar"}')
>>> obj['MY_STRING']
u'Foo\tBar'
>>> print obj['MY_STRING']
Foo    Bar

탈출하지 않고'\t'에러가 발생합니다.

>>> json.loads('{"MY_STRING": "Foo\tBar"}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 19 (char 18)

내 경험을 공유하기 위해:

저는 snake make와 Json으로 작성된 설정 파일을 사용하고 있습니다.json 파일에는 들여쓰기를 위한 탭이 있습니다.TAB는 이 목적을 위해 합법적입니다.그러나 snakemake.exceptions 오류 메시지가 나타납니다.WorkflowError: 구성 파일이 유효한 JSON 또는 YAML이 아닙니다. 이것은 snake make의 버그라고 생각합니다만, 틀릴 수 있습니다.댓글 달아주세요.모든 탭을 공백으로 교체하면 오류 메시지가 사라집니다.

노드 레드 플로우에서는 다음과 같은 문제가 발생합니다.

flow.set("delimiter",'"\t"');

에러:

{ "status": "ERROR", "result": "Cannot parse config: String: 1: in value for key 'delimiter': JSON does not allow unescaped tab in quoted strings, use a backslash escape" }  

솔루션:

넣었어요\\t암호에 입력되어 있습니다.

 flow.set("delimiter",'"\\t"');

언급URL : https://stackoverflow.com/questions/19799006/unable-to-parse-tab-in-json-files

반응형