programing

JSON을 해석(읽기)하여 사용하려면 어떻게 해야 합니까?

itsource 2023. 3. 8. 23:03
반응형

JSON을 해석(읽기)하여 사용하려면 어떻게 해야 합니까?

내 Python 프로그램은 JSON 데이터를 수신하고, 나는 그것으로부터 약간의 정보를 얻을 필요가 있다.데이터를 어떻게 해석하고 결과를 사용할 수 있습니까?는 거거 i i i i i를 사용해야 할 것 .json.loads츠키노

를 들어, 제가 '아까', '아까', '아까', '아까'를 가정해 보겠습니다.jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'과 「JSON」의 "two" 대응하는 데이터, 즉 데이터, 즉 데이터를 수 "2"


.load.loads현악기용입니다.참고 항목: 파일에서 JSON 읽기

때때로 JSON 문서는 표 형식의 데이터를 나타내기 위한 것입니다.이와 같은 기능을 가지고 있으며 Panda와 함께 사용하려는 경우 Python - How to convert JSON File to Dataframe을 참조하십시오.

일부 데이터는 표면적으로는 JSON과 비슷하지만 JSON은 아닙니다.

를 들어, 이 는 를, 이, 를, for, for, 이, 이, 습, 습, 습, 습, 습, for, for, for, for, for, for, for, for, for, for, for comes,repr파이썬에 따라 따옴표를할 수 . 으로 구분된 따옴표를 사용합니다. 이치노True ★★★★★★★★★★★★★★★★★」False JSON이 true ★★★★★★★★★★★★★★★★★」false이러한 데이터에 대해서는 사전의 문자열 표현을 사전으로 변환 또는 목록의 문자열 표현을 목록으로 변환하는 방법참조하십시오.

또 다른 일반적인 바리안트 형식에서는 입력의 행에 유효한 JSON 형식의 데이터가 별도로 배치됩니다(적절한 JSON은 여러 줄의 간격을 둘 수 있는 균형 있는 대괄호를 사용하기 때문에 한 줄씩 구문 분석할 수 없습니다).이 형식을 JSONL이라고 합니다.JSONL 파일을 JSON 개체로 로드를 참조하십시오.

웹 소스의 JSON 데이터가 추가 텍스트로 채워지는 경우가 있습니다.일부 컨텍스트에서는 이것이 브라우저의 보안 제한에 대응합니다.이것은 JSONP라고 불리며, 「JSONP란 무엇인가」에 설명되어 있습니다.또, JSONP는 왜 작성되었습니까?다른 맥락에서 추가 텍스트는 "Google이 JSON 응답을 추가하는 이유(1)"에서 설명한 바와 같이 보안 조치를 구현합니다.어느 쪽이든 Python에서 이것을 처리하는 것은 간단합니다.추가 텍스트를 식별하고 삭제하고 이전과 같이 진행하십시오.

매우 심플:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print(data['two'])  # or `print data['two']` in Python 2

가끔 당신의 아들이 끈이 아닐 때도 있어요.예를 들어 다음과 같은 URL에서 json을 얻는 경우:

j = urllib2.urlopen('http://site.com/data.json')

json.load가 아닌 json.load를 사용해야 합니다.

j_obj = json.load(j)

(잊어버리기 쉽다: 's'는 'string'을 의미한다.)

또는는, URL 「」를 합니다.json.load() 콘텐츠가 있는 .json을 사용합니다.json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

다음은 도움이 될 수 있는 간단한 예입니다.

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

상기 코드의 출력은 다음과 같습니다.

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

dump의 ident 인수를 설정하여 다음과 같이 인쇄할 수 있습니다(예: print json.dump(data, ind=4)).

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

데이터 해석

json 표시

문자열 데이터의 경우 다음을 사용합니다.

import json

text = '{"one" : "1", "two" : "2", "three" : "3"}'
parsed = json.loads(example)

파일 또는 기타 파일 유사 개체에서 가져온 데이터의 경우 다음을 사용합니다.

import io, json
# create an in-memory file-like object for demonstration purposes.
text = '{"one" : "1", "two" : "2", "three" : "3"}'
stream = io.StringIO(text)
parsed = json.load(stream) # load, not loads

로 이어지는 it it별은:::::: it it it it: it it:sloads'string (인 이름 짓기 관행에 않을 수 있습니다. ('string'은 'string과 일치하지 않습니다.

:json.load 는 파일 경로를 받아들이지 않습니다.

>>> json.load('example.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/json/__init__.py", line 293, in load
    return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

이들 함수는 모두 해석 프로세스를 커스터마이즈하기 위한 동일한 추가 옵션 세트를 제공합니다.3.6 이후 옵션은 키워드 전용입니다.

문자열 데이터의 경우 라이브러리에서 제공하는 클래스를 다음과 같이 사용할 수도 있습니다.

import json
text = '{"one" : "1", "two" : "2", "three" : "3"}'
decoder = json.JSONDecoder()
parsed = decoder.decode(text)

같은 키워드 파라미터를 사용할 수 있지만,이러한 파라미터는가 아닌의 컨스트럭터에게 전달됩니다..decode 수업의 장점인 수업입니다..raw_decode 후 합니다.

import json
text_with_junk = '{"one" : "1", "two" : "2", "three" : "3"} ignore this'
decoder = json.JSONDecoder()
# `amount` will count how many characters were parsed.
parsed, amount = decoder.raw_decode(text_with_junk)

「」를 사용합니다.requests 암묵적

있는 requests라이브러리, 추출할 필요가 없습니다..text오브젝트를 )에서 (또는 파일 같은 오브젝트를 만듭니다.Response이치노 Response.json:

import requests
response = requests.get('https://www.example.com')
parsed = response.json()

라이브러리와 .json★★★★★★★★★★★★★★★★★★.

결과 사용

위의 방법 중 하나로 구문 분석하면 기본적으로는 완전히 일반적인 기본 제공 유형으로 구성된 완전히 일반적인 Python 데이터 구조가 됩니다. dict,list,str,int,float,bool(JSON))true ★★★★★★★★★★★★★★★★★」false 상수 Python이 True ★★★★★★★★★★★★★★★★★」False 및 )의 개요NoneType(JSON))null Python이 .None를 참조해 주세요.

따라서 이 결과를 사용하여 작업하는 것은 다른 기술을 사용하여 동일한 데이터를 얻은 같은 방식으로 작동합니다.

따라서 질문에서 예제를 계속 진행하려면 다음 절차를 따릅니다.

>>> parsed
{'one': '1', 'two': '2', 'three': '3'}
>>> parsed['two']
'2'

나는 많은 사람들이 결과에 특별한 무언가가 있다고 기대하는 것 같기 때문에 이것을 강조한다; 그렇지 않다.이는 중첩된 데이터 구조일 뿐이지만 중첩을 다루는 것은 이해하기 어려울 수 있습니다.

구문 해 봅시다result = {'a': [{'b': 'c'}, {'d': 'e'}]}를 입수하다.갖기 위해'e'한 번에 요.a dict 목록이 .[{'b': 'c'}, {'d': 'e'}]의 두 (index ; index ; ; ;인인인 ( 1는 )개요{'d': 'e'}; 및 검색.'d' 시 " " " 가 표시됩니다.'e'하는 코드는 '비밀번호'입니다.result['a'][1]['d']: 각 : : : : : : : : : : : : : : : : 。

자세한 내용은 중첩된 데이터 구조에서 단일 값을 추출하는 방법(예: JSON 구문 분석)을 참조하십시오.

때때로 사람들은 더 복잡한 선택 기준을 적용하고, 중첩된 목록에 대해 반복하고, 데이터를 필터링하거나 변환하고 싶어합니다.이것들은 다른 곳에서 다루게 될 보다 복잡한 주제들이다.

일반적인 혼란의 원인

JSON 닮음

JSON 데이터를 해석하기 전에 데이터가 실제로 JSON인지 확인하는 것이 중요합니다.JSON 형식 사양을 확인하여 예상되는 내용을 확인합니다.요점:

  • 이 문서는 하나의 값(일반적으로 Python에 해당하는 JSON "개체")을 나타냅니다.dict단, JSON으로 표시되는 다른 모든 타입은 허용됩니다).특히 각 행에 별도의 엔트리가 없습니다.JSONL 입니다.

  • 데이터는 표준 텍스트 부호화(통상은 UTF-8)를 사용한 후에 사람이 판독할 수 있습니다.대부분의 텍스트는 큰따옴표 안에 포함되며 필요에 따라 이스케이프 시퀀스를 사용합니다.

임베디드 데이터 처리

다음 파일이 포함된 예제 파일을 생각해 보십시오.

{"one": "{\"two\": \"three\", \"backslash\": \"\\\\\"}"}

여기 백슬래시는 JSON의 탈출 메커니즘입니다.위의 방법 중 하나로 해석하면 다음과 같은 결과가 나옵니다.

>>> example = input()
{"one": "{\"two\": \"three\", \"backslash\": \"\\\\\"}"}
>>> parsed = json.loads(example)
>>> parsed
{'one': '{"two": "three", "backslash": "\\\\"}'}

「 」라는 점에 해 주세요.parsed['one'] 아니라dict다만, 그 문자열 자체는 「임베디드」JSON 데이터를 나타내고 있습니다.

포함된 데이터를 구문 분석된 결과로 대체하려면 데이터에 액세스하고 동일한 구문 분석 기술을 사용한 다음(예: 원래 결과를 업데이트하여) 계속하십시오.

>>> parsed['one'] = json.loads(parsed['one'])
>>> parsed
{'one': {'two': 'three', 'backslash': '\\'}}

에 주의:'\\'여기서 part는 실제 백슬래시를 2개가 아닌1개 포함하는 문자열의 표현입니다.이것은 문자열 이스케이프에 대한 일반적인 Python 규칙을 따르는 것입니다.그것은 우리에게...

JSON 이스케이프 VSPython 문자열 리터럴 이스케이프

때때로 사람들은 JSON을 해석하는 코드를 테스트하려고 할 때 혼란스러워하고 Python 소스 코드에서 잘못된 문자열 리터럴로 입력을 제공합니다.특히 임베디드 JSON에서 동작하는 코드를 테스트하려고 할 때 발생합니다.

문제는 JSON 형식과 문자열 리터럴 형식 각각에 데이터 이스케이프 정책이 따로 있다는 것입니다.Python은 스트링을 작성하기 위해 스트링 리터럴로 이스케이프를 처리합니다.이 스트링 리터럴에는 여전히 JSON 포맷에서 사용되는 이스케이프 시퀀스포함되어 있어야 합니다.

예에서는 ""를 했습니다.input인터프리터 프롬프트에서 샘플 데이터를 표시하여 이스케이프와의 혼동을 방지합니다.다음에, 송신원에 문자열 리터럴을 사용하는 유사한 예를 나타냅니다.

>>> json.loads('{"one": "{\\"two\\": \\"three\\", \\"backslash\\": \\"\\\\\\\\\\"}"}')
{'one': '{"two": "three", "backslash": "\\\\"}'}

대신 큰따옴표로 묶은 문자열 리터럴을 사용하려면 문자열 리터럴의 큰따옴표도 이스케이프해야 합니다.다음과 같이 됩니다.

>>> json.loads('{\"one\": \"{\\\"two\\\": \\\"three\\\", \\\"backslash\\\": \\\"\\\\\\\\\\\"}\"}')
{'one': '{"two": "three", "backslash": "\\\\"}'}

의 각 \\\"이 「」이 됩니다.\"「JSON」이 입니다."JSON 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON' 'SON'similarly유 similarly,, similarly 、\\\\\\\\\\\"후따옴표)는 (5쌍의 백슬래시)가 됩니다.\\\\\"에서는 (의 백슬래시와 따옴표,그 후 따옴표가 됩니다는 (5'의 '2'의 '2'의 'JSON'이 됩니다.이거는\\"를 JSON하면 (2개의 백슬래시 및 따옴표)가 됩니다.\\\\"구문 분석 결과의 문자열 표현에 (2개의 이스케이프된 백슬래시와 따옴표)가 있습니다(이후 Python은 문자열에 작은 따옴표를 사용할 수 있지만 백슬래시는 여전히 사용할 수 있으므로 따옴표는 이스케이프할 필요가 없습니다).

심플한 커스터마이즈

그그 aside the the strict에서 사용할 수 옵션json.load ★★★★★★★★★★★★★★★★★」json.loads콜백이어야 합니다.파서는 이들을 호출하여 데이터의 일부를 전달하고 반환되는 모든 것을 사용하여 전체 결과를 생성합니다.

은 매우합니다.파스" 훅은 매우 명확합니다.들어 을 ""로 변환하도록 할 수 .decimal.Decimal Python을 하는 대신 인스턴스()를 합니다.float:

>>> import decimal
>>> json.loads('123.4', parse_float=decimal.Decimal)
Decimal('123.4')

또는 대신 정수로 변환할 수 있더라도 모든 값에 대해 부동산을 사용합니다.

>>> json.loads('123', parse_int=float)
123.0

또는 특수 부동 소수점 값의 JSON 표현 변환을 거부합니다.

>>> def reject_special_floats(value):
...     raise ValueError
... 
>>> json.loads('Infinity')
inf
>>> json.loads('Infinity', parse_constant=reject_special_floats)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/json/__init__.py", line 370, in loads
    return cls(**kw).decode(s)
  File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
  File "<stdin>", line 2, in reject_special_floats
ValueError

를 사용한 object_hook ★★★★★★★★★★★★★★★★★」object_pairs_hook

object_hook ★★★★★★★★★★★★★★★★★」object_pairs_hook는 Python Python Python 하는 것이 오브젝트를 지정했을 때 수행하는 하기 위해 할 수 .dictA · A 공 。object_pairs_hook됩니다.는 1개의 인수로 호출됩니다.는 1개의 인수로 호출되지 않는 키와 됩니다.1번인수에는 키와 값의 쌍이 포함되어 있지 않으면dict.dict타타: :

>>> def process_object_pairs(items):
...     return {k: f'processed {v}' for k, v in items}
... 
>>> json.loads('{"one": 1, "two": 2}', object_pairs_hook=process_object_pairs)
{'one': 'processed 1', 'two': 'processed 2'}

공급된 Aobject_hook대신, 를 사용하여 호출됩니다.dict그렇지 않으면 다음과 같은 결과가 생성됩니다.

>>> def make_items_list(obj):
...     return list(obj.items())
... 
>>> json.loads('{"one": 1, "two": 2}', object_hook=make_items_list)
[('one', 1), ('two', 2)]

다되면 둘 if if if if ifobject_hook무시되고 오직object_items_hook용됩니니다다

및 " " "bytes/unicode에 빠뜨림

JSON은 기본적으로 텍스트 형식입니다.파일을 구문 분석하기 전에 먼저 적절한 인코딩을 사용하여 입력 데이터를 원시 바이트에서 텍스트로 변환해야 합니다.

에서는 3.x bytes오브젝트가 지원되며 UTF-8 인코딩을 암묵시적으로 UTF-8 인코딩을 사용합니다.

>>> json.loads('"text"')
'text'
>>> json.loads(b'"text"')
'text'
>>> json.loads('"\xff"') # Unicode code point 255
'ÿ'
>>> json.loads(b'"\xff"') # Not valid UTF-8 encoded data!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/json/__init__.py", line 343, in loads
    s = s.decode(detect_encoding(s), 'surrogatepass')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 1: invalid start byte

UTF-8은 일반적으로 JSON의 디폴트로 간주됩니다.원래의 사양에서는 ECMA-404는 인코딩을 요구하지 않지만(JSON 파일 또는 문서가 아닌 'JSON 텍스트'만을 기술하고 있습니다), RFC 8259는 다음을 요구하고 있습니다.

폐쇄 생태계의 일부가 아닌 시스템 간에 교환되는 JSON 텍스트는 UTF-8을 사용하여 인코딩되어야 합니다 [RFC3629].

이와 같은 "닫힌 생태계"(즉, 다르게 인코딩되어 공개적으로 공유되지 않는 로컬 문서의 경우)에서는 먼저 적절한 인코딩을 명시적으로 적용합니다.

>>> json.loads(b'"\xff"'.decode('iso-8859-1'))
'ÿ'

마찬가지로 JSON 파일은 이진 모드가 아닌 텍스트 모드로 열어야 합니다.파일이 다른 인코딩을 사용하는 경우 파일을 열 때 다음을 지정하기만 하면 됩니다.

with open('example.json', encoding='iso-8859-1') as f:
    print(json.load(f))

2.x에서는 문자열과 바이트 시퀀스가 적절히 구별되지 않았기 때문에 특히 JSON을 사용할 때 많은 문제와 혼란이 발생했습니다.

2.x 코드베이스를 적극적으로 유지관리( 2.x 자체는 2020년 1월 1일 이후 유지보수가 되지 않음)할 경우,unicode와 ""를 값"str data를 값( raw datastr입니다.bytes및 (2.x)가 (2.x)로 되어 .reprunicode에는 ''가 .u 필요가 있습니다).prefix( 「 「 REP 」 「 REP 」 「 REP 」 「 REP 」 「 」 「 」 ) 。

메모 : 력력 histor histor :simplejson

simplejson 는 단순한 표준 라이브러리 모듈이지만 외부에서 유지개발됩니다.원래 Python 표준 라이브러리에 JSON 지원이 추가되기 전에 생성되었습니다.2.6에서는simplejson가 표준 되었습니다.json현재 개발에서는 2.5까지 호환성을 유지하고 있지만, 2.2까지 지원해야 하는 유지보수가 되지 않은 레거시 브랜치도 있습니다.

표준 라이브러리는 일반적으로 꽤 오래된 버전의 패키지를 사용합니다(예: 3.8.10 설치 보고서).

>>> json.__version__
'2.0.9'

한편, 최신 릴리스(이 문서에서는)는 3.18.1입니다.(Github 저장소의 태그 부착 릴리스는 3.8.2까지 거슬러 올라갑니다.2.0.9 릴리스는 2009년으로 되어 있습니다.

는 아직 수 .simplejson파이톤

언급URL : https://stackoverflow.com/questions/7771011/how-can-i-parse-read-and-use-json

반응형