python之json模块

JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。

0x00简介:

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON、XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

0x01常用函数:

json.dumps方法对简单数据类型encoding

encoding:把一个Python对象编码转换成Json字符串

decoding:把Json格式字符串解码转换成Python对象

import json
data = [{'a':"A",'b':(2,4),'c':3.0}]  #list对象
print "DATA:",repr(data)

data_string = json.dumps(data)
print "JSON:",data_string

输出:

DATA: [{'a':'A','c':3.0,'b':(2,4)}]
JSON: [{"a":"A","c":3.0,"b":[2,4]}]  

json.loads方法处理简单数据类型的decoding(解码)转换

使用loads方法即可将json字符串转换成python对象。

import json
data = [{'a':"A",'b':(2,4),'c':3.0}]  #list对象

data_string = json.dumps(data)
print "ENCODED:",data_string

decoded = json.loads(data_string)
print "DECODED:",decoded

print "ORIGINAL:",type(data[0]['b'])
print "DECODED:",type(decoded[0]['b'])

输出:

ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]
DECODED: [{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]
ORIGINAL: <type 'tuple'>

sort_keys是告诉编码器按照字典排序(a到z)输出,

import json
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
unsorted = json.dumps(data)
print 'JSON:', json.dumps(data)
print 'SORT:', json.dumps(data, sort_keys=True)

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
SORT: [{"a": "A", "b": [2, 4], "c": 3.0}

indent参数根据数据格式缩进显示,读起来更加清晰:

print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)

json格式字符串写入到文件流中

import json
import tempfile

f = tempfile.NamedTemporaryFile(mode='w+')
f.write('[{"a": "A", "c": 3.0, "b": [2, 4]}]')
f.flush()
f.seek(0)

print json.load(f)

输出:

[{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]

基本案例:

案例1,

import json
js=json.loads('{"json":"你是我的,你好"}')
print json.dumps(js)
print json.dumps(js,ensure_ascii=False)

案例2,

import json
js=json.loads('{"json":"你是我的,你好"}')
print json.dumps(js,encoding="GB2312")
print json.dumps(js,encoding="utf-8")

案例3,

import json
s = '[{"name":"鸟巢","point":{"lat":"39.990","lng":"116.397"},"desc":"奥运会主场地"},{"name":"北大乒乓球馆","point":{"lat":"39.988","lng":"116.315"},"desc":"乒乓球比赛场地"},{"name":"北京工人体育场","point": {"lat":"39.930","lng":"116.446"},"desc":"足球比赛场地"}]'
print type(s)    
locations = json.loads(s)
print type(locations)    
#注:read是json-py.py和minijson.py的方法,而python2.6开始自带的lib库里用的是simplejson.py,其没有read方法,而是load/loads
print str(len(locations)) #因为json.load()之后的对象就是dict类型的!
for location in locations:
    print location["name"]
    print location["point"]["lat"]

案例4,

import json
json_string='{"first_name":"Guido","last_name":"Russum"}'
print json_string
print type(json_string)
parsed_json=json.loads(json_string)
print parsed_json
print type(parsed_json)
print parsed_json['last_name']
print json.dumps(json_string)
print json.loads(json_string)