>  기사  >  백엔드 개발  >  json에 대한 Python 관련 작업 예제에 대한 자세한 설명

json에 대한 Python 관련 작업 예제에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-01-07 13:17:401163검색

이 글에서는 예제를 통해 json에서 Python의 관련 작업을 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

json이란 무엇인가요?

JSON(JavaScript Object Notation)은 가벼운 데이터 교환 형식입니다. 인간이 읽고 쓰기가 쉽습니다. 기계가 구문 분석하고 생성하는 것도 쉽습니다. 이는 표준 ECMA-262 3판(1999년 12월)의 하위 집합인 JavaScript 프로그래밍 언어를 기반으로 합니다. JSON은 완전히 언어 독립적인 텍스트 형식을 사용하지만 C 언어 계열(C, C++, C#, Java, JavaScript, Perl, Python 등 포함)과 유사한 규칙도 사용합니다. 이러한 속성은 JSON을 이상적인 데이터 교환 언어로 만듭니다.

JSON은

이름/값 쌍의 컬렉션이라는 두 가지 구조로 구성됩니다. 다른 언어에서는 객체, 레코드, 구조체, 사전, 해시 테이블, 키 목록 또는 연관 배열로 이해됩니다.

순서가 지정된 값 목록입니다. 대부분의 언어에서는 배열로 이해됩니다.

일반적인 데이터 구조입니다. 실제로 대부분의 현대 컴퓨터 언어는 어떤 형태로든 이를 지원합니다. 이를 통해 이러한 구조를 기반으로 하는 프로그래밍 언어 간에 데이터 형식을 교환할 수 있습니다.

json에 대한 공식적인 설명은 http://json.org/를 참조하세요.

json을 작동하는 Python의 표준 API 라이브러리 참조: http://docs.python.org/ library/json.html

간단한 데이터 유형의 인코딩 및 디코딩:

간단한 json.dumps 메서드를 사용하여 간단한 데이터 유형을 인코딩합니다. 예:

import json
obj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]
encodedjson = json.dumps(obj)
print repr(obj)
print encodedjson

출력:

[[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}]
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}]

출력 결과에서 볼 수 있듯이 인코딩 후의 단순 유형은 원래 repr() 출력과 매우 유사하지만 일부 데이터 유형이 변경되었습니다. 위의 예는 목록으로 변환됩니다. json을 인코딩하는 동안 Python 원본 유형에서 json 유형으로 변환하는 과정이 있습니다. 구체적인 변환 비교는 다음과 같습니다.

json에 대한 Python 관련 작업 예제에 대한 자세한 설명

json.dumps() 메서드가 str 객체 encodejson을 반환하면, 다음으로 인코딩된 json을 디코딩하여 사용해야 하는 json.loads() 함수:

decodejson = json.loads(encodedjson)
print type(decodejson)
print decodejson[4]['key1']
print decodejson

출력:

<type &#39;list&#39;>
[1, 2, 3]
[[1, 2, 3], 123, 123.123, u&#39;abc&#39;, {u&#39;key2&#39;: [4, 5, 6], u&#39;key1&#39;: [1, 2, 3]}]

loads 메소드는 원래 객체를 반환하지만 일부 데이터 유형 변환은 여전히 ​​발생합니다. 예를 들어 위의 예에서는 'abc'가 유니코드 형식으로 변환됩니다. json에서 python으로의 유형 변환 비교는 다음과 같습니다.

json에 대한 Python 관련 작업 예제에 대한 자세한 설명

json.dumps 메소드는 선택할 수 있는 많은 유용한 매개변수를 제공합니다. 가장 일반적으로 사용되는 매개변수는 sort_keys입니다. dict 객체) 정렬, 기본 dict가 순서 없이 저장됨), 구분 기호, 들여쓰기 및 기타 매개변수를 알고 있습니다.

정렬 기능을 사용하면 저장된 데이터를 관찰하기 더 쉽게 만들고 json 출력 개체를 비교할 수도 있습니다. 예:

data1 = {&#39;b&#39;:789,&#39;c&#39;:456,&#39;a&#39;:123}
data2 = {&#39;a&#39;:123,&#39;b&#39;:789,&#39;c&#39;:456}
d1 = json.dumps(data1,sort_keys=True)
d2 = json.dumps(data2)
d3 = json.dumps(data2,sort_keys=True)
print d1
print d2
print d3
print d1==d2
print d1==d3

출력:

{"a": 123, "b": 789, "c": 456}
{"a": 123, "c": 456, "b": 789}
{"a": 123, "b": 789, "c": 456}
False
True

위의 예에서 원래 data1과 data2 데이터는 동일해야 하지만 dict 저장의 순서가 지정되지 않은 특성으로 인해 두 개는 비교할 수 없습니다. 따라서 데이터 불일치를 방지하기 위해 두 가지를 정렬된 결과를 통해 저장할 수 있습니다. 그러나 정렬 후 저장하기 전에 시스템에서 더 많은 작업을 수행해야 하므로 일정량의 성능 소모가 발생하므로 적절한 정렬이 매우 중요합니다.

indent 매개변수는 들여쓰기를 의미하며, 이를 통해 데이터 저장 형식을 더욱 우아하게 만들 수 있습니다.

data1 = {&#39;b&#39;:789,&#39;c&#39;:456,&#39;a&#39;:123}
d1 = json.dumps(data1,sort_keys=True,indent=4)
print d1

출력:

{
 "a": 123,
 "b": 789,
 "c": 456
}

출력 데이터 형식은 다음 이후입니다. 즉, 읽기가 더 쉽지만 중복된 공백을 추가하여 채워집니다. JSON은 주로 데이터 통신 형식으로 존재하며 네트워크 통신은 데이터의 크기에 매우 관심이 많습니다. 쓸모 없는 공간은 통신 대역폭을 많이 차지하므로 적절한 경우 데이터를 압축해야 합니다. 분리자 매개변수가 이 역할을 할 수 있습니다. 전달된 매개변수는 분할 객체의 문자열을 포함하는 튜플입니다.

print &#39;DATA:&#39;, repr(data)
print &#39;repr(data)  :&#39;, len(repr(data))
print &#39;dumps(data)  :&#39;, len(json.dumps(data))
print &#39;dumps(data, indent=2) :&#39;, len(json.dumps(data, indent=4))
print &#39;dumps(data, separators):&#39;, len(json.dumps(data, separators=(&#39;,&#39;,&#39;:&#39;)))

출력:

DATA: {&#39;a&#39;: 123, &#39;c&#39;: 456, &#39;b&#39;: 789}
repr(data)  : 30
dumps(data)  : 30
dumps(data, indent=2) : 46
dumps(data, separators): 25

추가 공백 기호를 제거하여, 데이터 압축 목적을 달성했으며 그 효과는 매우 분명합니다.

또 다른 유용한 덤프 매개변수는 Skipkeys이며 기본값은 False입니다. dump 메소드가 dict 객체를 저장하는 경우 키는 str 유형이어야 합니다. 다른 유형이 나타나면 TypeError 예외가 생성되고 이 매개변수가 True로 설정되면 더 우아해집니다.

data = {&#39;b&#39;:789,&#39;c&#39;:456,(1,2):123}
print json.dumps(data,skipkeys=True)

출력:

{"c": 456, "b": 789}

자신만의 데이터 유형 처리

json 모듈은 일반적인 Python 내장 유형뿐만 아니라 사용자 정의 데이터 유형도 처리할 수 있으며 사용자 정의 개체를 처리하는 경우가 많습니다.

먼저 Person 클래스를 정의합니다.

class Person(object):
 def __init__(self,name,age):
 self.name = name
 self.age = age
 def __repr__(self):
 return &#39;Person Object name : %s , age : %d&#39; % (self.name,self.age)
if __name__ == &#39;__main__&#39;:
 p = Person(&#39;Peter&#39;,22)
 print p

如果直接通过json.dumps方法对Person的实例进行处理的话,会报错,因为json无法支持这样的自动转化。通过上面所提到的json和python的类型转化对照表,可以发现,object类型是和dict相关联的,所以我们需要把我们自定义的类型转化为dict,然后再进行处理。这里,有两种方法可以使用。

方法一:自己写转化函数

&#39;&#39;&#39;
Created on 2011-12-14
@author: Peter
&#39;&#39;&#39;
import Person
import json
p = Person.Person(&#39;Peter&#39;,22)
def object2dict(obj):
 #convert object to a dict
 d = {}
 d[&#39;__class__&#39;] = obj.__class__.__name__
 d[&#39;__module__&#39;] = obj.__module__
 d.update(obj.__dict__)
 return d
def dict2object(d):
 #convert dict to object
 if&#39;__class__&#39; in d:
 class_name = d.pop(&#39;__class__&#39;)
 module_name = d.pop(&#39;__module__&#39;)
 module = __import__(module_name)
 class_ = getattr(module,class_name)
 args = dict((key.encode(&#39;ascii&#39;), value) for key, value in d.items()) #get args
 inst = class_(**args) #create new instance
 else:
 inst = d
 return inst
d = object2dict(p)
print d
#{&#39;age&#39;: 22, &#39;__module__&#39;: &#39;Person&#39;, &#39;__class__&#39;: &#39;Person&#39;, &#39;name&#39;: &#39;Peter&#39;}
o = dict2object(d)
print type(o),o
#<class &#39;Person.Person&#39;> Person Object name : Peter , age : 22
dump = json.dumps(p,default=object2dict)
print dump
#{"age": 22, "__module__": "Person", "__class__": "Person", "name": "Peter"}
load = json.loads(dump,object_hook = dict2object)
print load
#Person Object name : Peter , age : 22

   

上面代码已经写的很清楚了,实质就是自定义object类型和dict类型进行转化。object2dict函数将对象模块名、类名以及__dict__存储在dict对象里,并返回。dict2object函数则是反解出模块名、类名、参数,创建新的对象并返回。在json.dumps 方法中增加default参数,该参数表示在转化过程中调用指定的函数,同样在decode过程中json.loads方法增加object_hook,指定转化函数。

方法二:继承JSONEncoder和JSONDecoder类,覆写相关方法

JSONEncoder类负责编码,主要是通过其default函数进行转化,我们可以override该方法。同理对于JSONDecoder。

&#39;&#39;&#39;
Created on 2011-12-14
@author: Peter
&#39;&#39;&#39;
import Person
import json
p = Person.Person(&#39;Peter&#39;,22)
class MyEncoder(json.JSONEncoder):
 def default(self,obj):
 #convert object to a dict
 d = {}
 d[&#39;__class__&#39;] = obj.__class__.__name__
 d[&#39;__module__&#39;] = obj.__module__
 d.update(obj.__dict__)
 return d
class MyDecoder(json.JSONDecoder):
 def __init__(self):
 json.JSONDecoder.__init__(self,object_hook=self.dict2object)
 def dict2object(self,d):
 #convert dict to object
 if&#39;__class__&#39; in d:
  class_name = d.pop(&#39;__class__&#39;)
  module_name = d.pop(&#39;__module__&#39;)
  module = __import__(module_name)
  class_ = getattr(module,class_name)
  args = dict((key.encode(&#39;ascii&#39;), value) for key, value in d.items()) #get args
  inst = class_(**args) #create new instance
 else:
  inst = d
 return inst
d = MyEncoder().encode(p)
o = MyDecoder().decode(d)
print d
print type(o), o

   

对于JSONDecoder类方法,稍微有点不同,但是改写起来也不是很麻烦。看代码应该就比较清楚了。

希望本文所述对大家Python程序设计有所帮助。

更多json에 대한 Python 관련 작업 예제에 대한 자세한 설명相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.