Python 은 JSON 데 이 터 를 읽 고 기록 하 는 방법

문제.
JSON(JavaScript Object Notation)인 코딩 형식의 데 이 터 를 읽 고 싶 습 니 다.
해결 방안
json 모듈 은 JSON 데 이 터 를 인 코딩 하고 디 코딩 하 는 간단 한 방식 을 제공 합 니 다.그 중에서 두 가지 주요 함 수 는 json.dumps()와 json.loads()로 다른 직렬 화 함수 라 이브 러 리,예 를 들 어 pickle 의 인터페이스 보다 훨씬 적다.Python 데이터 구 조 를 JSON 으로 변환 하 는 방법 을 보 여 줍 니 다.

import json

data = {
 'name' : 'ACME',
 'shares' : 100,
 'price' : 542.23
}

json_str = json.dumps(data)
JSON 인 코딩 문자열 을 Python 데이터 구조 로 변환 하 는 방법 을 보 여 줍 니 다.

data = json.loads(json_str)
문자열 이 아 닌 파일 을 처리 하려 면 json.dump()와 json.load()를 사용 하여 JSON 데 이 터 를 인 코딩 하고 디 코딩 할 수 있 습 니 다.예 를 들 면:

# Writing JSON data
with open('data.json', 'w') as f:
 json.dump(data, f)

# Reading data back
with open('data.json', 'r') as f:
 data = json.load(f)
토론 하 다.
JSON 인 코딩 이 지원 하 는 기본 데이터 형식 은 None,bool,int,float,str,그리고 이러한 유형의 데 이 터 를 포함 하 는 lists,tuples,dictionaries 입 니 다.dictionaries 에 대해 keys 는 문자열 형식 이 필요 합 니 다.JSON 규범 을 따 르 기 위해 서 는 Python 의 lists 와 dictionaries 만 인 코딩 해 야 합 니 다.그리고 웹 프로그램 에서 최상 위 대상 이 사전 으로 인 코딩 되 는 것 은 표준 방법 입 니 다.
JSON 인 코딩 의 형식 은 Python 문법 에 있어 서 거의 똑 같 습 니 다.작은 차 이 를 제외 하고.예 를 들 어 True 는 true 로,False 는 false 로,None 는 null 로 매 핑 됩 니 다.인 코딩 된 문자열 효 과 를 보 여 주 는 예 입 니 다.

>>> json.dumps(False)
'false'
>>> d = {'a': True,
...  'b': 'Hello',
...  'c': None}
>>> json.dumps(d)
'{"b": "Hello", "c": null, "a": true}'
>>>
JSON 디 코딩 후의 데 이 터 를 검사 해 보면 간단 한 인쇄 를 통 해 구 조 를 확인 하기 가 쉽 지 않 습 니 다.특히 데이터 의 내장 구조 가 깊 거나 대량의 필드 를 포함 할 때.이 문 제 를 해결 하기 위해 서 는 일반적인 print()함수 대신 pprint 모듈 의 pprint()함 수 를 사용 하 는 것 을 고려 할 수 있 습 니 다.그것 은 키 의 알파벳 순서에 따라 더욱 아름 다운 방식 으로 출력 된다.트 위 터 검색 결 과 를 예 쁘 게 출력 하 는 방법 을 보 여 주 는 예 입 니 다.

>>> from urllib.request import urlopen
>>> import json
>>> u = urlopen('http://search.twitter.com/search.json?q=python&rpp=5')
>>> resp = json.loads(u.read().decode('utf-8'))
>>> from pprint import pprint
>>> pprint(resp)
{'completed_in': 0.074,
'max_id': 264043230692245504,
'max_id_str': '264043230692245504',
'next_page': '?page=2&max_id=264043230692245504&q=python&rpp=5',
'page': 1,
'query': 'python',
'refresh_url': '?since_id=264043230692245504&q=python',
'results': [{'created_at': 'Thu, 01 Nov 2012 16:36:26 +0000',
   'from_user': ...
   },
   {'created_at': 'Thu, 01 Nov 2012 16:36:14 +0000',
   'from_user': ...
   },
   {'created_at': 'Thu, 01 Nov 2012 16:36:13 +0000',
   'from_user': ...
   },
   {'created_at': 'Thu, 01 Nov 2012 16:36:07 +0000',
   'from_user': ...
   }
   {'created_at': 'Thu, 01 Nov 2012 16:36:04 +0000',
   'from_user': ...
   }],
'results_per_page': 5,
'since_id': 0,
'since_id_str': '0'}
>>>
일반적으로 JSON 디 코딩 은 제 공 된 데이터 에 따라 dicts 나 lists 를 만 듭 니 다.다른 유형의 대상 을 만 들 려 면 json.loads()에 object 를 전달 할 수 있 습 니 다.pairs_hook 또는 objecthook 매개 변수.예 를 들 어 JSON 데 이 터 를 디 코딩 하고 OrderedDict 에서 순 서 를 유지 하 는 방법 을 보 여 주 는 예 입 니 다.

>>> s = '{"name": "ACME", "shares": 50, "price": 490.1}'
>>> from collections import OrderedDict
>>> data = json.loads(s, object_pairs_hook=OrderedDict)
>>> data
OrderedDict([('name', 'ACME'), ('shares', 50), ('price', 490.1)])
>>>
다음은 JSON 사전 을 Python 대상 으로 바 꾸 는 방법 입 니 다.

>>> class JSONObject:
...  def __init__(self, d):
...   self.__dict__ = d
...
>>>
>>> data = json.loads(s, object_hook=JSONObject)
>>> data.name
'ACME'
>>> data.shares
50
>>> data.price
490.1
>>>
마지막 예 에서 JSON 디 코딩 후의 사전 은 하나의 매개 변수 로 에 전달 된다.init__() 。그 다음 에 당신 은 그것 을 마음대로 사용 할 수 있 습 니 다.예 를 들 어 인 스 턴 스 사전 으로 직접 사용 할 수 있 습 니 다.
JSON 을 인 코딩 할 때 유용 한 옵션 도 있 습 니 다.예 쁜 포맷 문자열 을 얻 고 출력 하려 면 json.dumps()의 indent 인 자 를 사용 하 십시오.출력 을 pprint()함수 와 유사 하 게 합 니 다.예 를 들 면:

>>> print(json.dumps(data))
{"price": 542.23, "name": "ACME", "shares": 100}
>>> print(json.dumps(data, indent=4))
{
 "price": 542.23,
 "name": "ACME",
 "shares": 100
}
>>>
대상 인 스 턴 스 는 보통 JSON 이 직렬 화 할 수 있 는 것 이 아니다.예 를 들 면:

>>> class Point:
...  def __init__(self, x, y):
...   self.x = x
...   self.y = y
...
>>> p = Point(2, 3)
>>> json.dumps(p)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/lib/python3.3/json/__init__.py", line 226, in dumps
  return _default_encoder.encode(obj)
 File "/usr/local/lib/python3.3/json/encoder.py", line 187, in encode
  chunks = self.iterencode(o, _one_shot=True)
 File "/usr/local/lib/python3.3/json/encoder.py", line 245, in iterencode
  return _iterencode(o, 0)
 File "/usr/local/lib/python3.3/json/encoder.py", line 169, in default
  raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.Point object at 0x1006f2650> is not JSON serializable
>>>
대상 인 스 턴 스 를 직렬 화 하려 면 함 수 를 제공 할 수 있 습 니 다.입력 은 인 스 턴 스 이 고 직렬 화 가능 한 사전 을 되 돌려 줍 니 다.예 를 들 면:

def serialize_instance(obj):
 d = { '__classname__' : type(obj).__name__ }
 d.update(vars(obj))
 return d
이 인 스 턴 스 를 거꾸로 가 져 오 려 면 이렇게 할 수 있 습 니 다.

# Dictionary mapping names to known classes
classes = {
 'Point' : Point
}

def unserialize_object(d):
 clsname = d.pop('__classname__', None)
 if clsname:
  cls = classes[clsname]
  obj = cls.__new__(cls) # Make instance without calling __init__
  for key, value in d.items():
   setattr(obj, key, value)
   return obj
 else:
  return d
다음은 이 함수 들 을 어떻게 사용 하 는 예 입 니까?

>>> p = Point(2,3)
>>> s = json.dumps(p, default=serialize_instance)
>>> s
'{"__classname__": "Point", "y": 3, "x": 2}'
>>> a = json.loads(s, object_hook=unserialize_object)
>>> a
<__main__.Point object at 0x1017577d0>
>>> a.x
2
>>> a.y
3
>>>
json 모듈 은 더 낮은 등급 의 숫자,NaN 과 같은 특수 값 을 제어 하 는 다른 옵션 도 많다.공식 문 서 를 참고 하여 더 많은 세부 사항 을 얻 을 수 있 습 니 다.
이상 은 파 이 썬 이 JSON 데 이 터 를 어떻게 읽 고 기록 하 는 지 에 대한 상세 한 내용 입 니 다.파 이 썬 이 json 데 이 터 를 읽 고 쓰 는 데 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기