python JSON

一、Python 操作JSON

1.python 2.6加入了json模块。
2.python的json模块 序列化和反序列化分别是dumps和loads
json.dumps():将一个Python对象编码成JSON字符串;
json.loads():将JSON格式字符串解码成Python对象。
3.对简单的数据类型可以直接处理。如:string,Unicode,int,float,list,tuple,dict

二、JSON简介
1.JSON:JavaScript Object Notation (JavaScript 对象表示法)
2.JSON是存储和交换文本信息的语法,类似XML
3.JSON比XML更小、更快,更易解析

三、JSON语法与语法规则
JSON语法:JSON语法是JavaScript语法的子集
JSON语法规则:
数据在名称/值对中;
数据由逗号分隔;
花括号保存对象;
方括号保存数组;

四、JSON名称/值对
JSON数据的书写格式是:名称/值对
“firstName”:“John”等价于下面这条JavaScript语句:firstName="John"

JSON值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true或false)
数组(在方括号中)
对象(在花括号中)
null

JSON对象
json对象是在花括号中书写的。对象可以包含多个名称/值对
{“firstName”:"John","lastName":"Doe"}
该条等价于 JavaScript语句中;
firstName = "John"
lastName = "Doe"

JSON数组
JSON数组,是在方括号中书写的。数组可以包含多个对象。
{"employee":[
{"firstName":"John","lastName":"Doe"},
{"firstName":"Anna","lastName":"Smith"},
{"firstName":"Peter","lastName":"Jones"}
]}
如上,employee是包含了三个对象的数组

五、JSON编码
使用json.dumps()方法来将一个Python数据类型列表编码成json格式的字符串.
Python类型
dict、list、tuple、str、unicode、int、long、float、True、False、None
JSON字符串类型
Object(dict)、array(list、tuple)、string(str、unicode)、number(int、long、float)、true、False、null

import json
data=[{'a':'A','b':(2,4),'c':3.0}]
res = repr(data) #repr()将对象转换为供解释器读取的形式
print ("data": ,res)
data_json=json.dumps(data)
print(data_json)

python 类型与Json类型示例比对
import json
a=[{1:12,"a":12.3},[1,2,3],(1,2),'asd','ad',12.13,3.3,True,False,None]

print("Python的类型:\n",a)
Python的类型:
[{1: 12, 'a': 12.3}, [1, 2, 3], (1, 2), 'asd', 'ad', 12.13, 3.3, True, False, None]
print("编码后的json串:\n",json.dumps(a))
编码后的json串:
[{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "asd", "ad", 12.13, 3.3, true, false, null]

json.dumps()

import json
data=[{'a':'A','x':(2,4),'c':3.0,"b":"4"}]
print (json.dumps(data))
[{"a": "A", "x": [2, 4], "c": 3.0, "b": "4"}]
print (json.dumps(data,sort_keys=True))
[{"a": "A", "b": "4", "c": 3.0, "x": [2, 4]}]

该方法返回编码后的一个json字符串,是一个str对象encodejson.
dumps函数的参数很多,比较常用的有
sort_keys:是否按字典排序(a到z)输出,因为默认编码或json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。

import json
data=[{'a':'A','x':(2,4),'c':3.0,"b":"4"}]
print (json.dumps(data))
[{"a": "A", "x": [2, 4], "c": 3.0, "b": "4"}]
print (json.dumps(data,sort_keys=True))
[{"a": "A", "b": "4", "c": 3.0, "x": [2, 4]}]

indent 缩进,输出格式

data=[{"a":"A","b":[2,4],"c":3.0}]
print(json.dumps(data,sort_keys=True,indent=3))
[
{
"a": "A",
"b": [
2,
4
],
"c": 3.0
}
]

separators 去掉逗号、分号、空格

import json
data=[{'a':'A','b':[2,4],'c':3.0}]
print(json.dumps(data,separators=(',',':')))
[{"a":"A","b":[2,4],"c":3.0}]
import json
data=[{'a':'A','b':[2,4],'c':3.0}]
print(json.dumps(data,separators=(',',':')))
[{"a":"A","b":[2,4],"c":3.0}]

skipkeys 跳过非string的对象

import json
data=[{'a':'A','b':(2,4),'c':3.0,(1,2):'D tuple'}]
try:
... res1=json.dumps(data)
... except Exception as e:
... print(e)
...
keys must be str, int, float, bool or None, not tuple

print(json.dumps(data,skipkeys=True))
[{"a": "A", "b": [2, 4], "c": 3.0}]

ensure_ascii
默认是Ture,ascii编码;False,unicode编码

import json
print(json.dumps("中国")))
"\u4e2d\u56fd"
print(json.dumps("中国",ensure_ascii=False))
"中国"

六、JSON解码
将json格式字符串解码成python对象,我们使用的是json.loads()函数。可以将简单的数据类型解码成python对象。

import json
data = [{'a':'Aasd','b':(2,4),'c':3.0}]
data_json = json.dumps(data)
print("encoding:",data_json)
print("decoding":json.loads(data_json))

编码时,无论是list还是tuple都会转换为json的数组;
解码时,json的数组最终都被转换为python的list.

将类对象编码成json串

class Employee(object):
... def init(self,name,age,sex,tel):
... self.name=name

data=[{"a":"A","b":[2,4],"c":3.0}]
>>> print(json.dumps(data,sort_keys=True,indent=3))
[
{
"a": "A",
"b": [
2,
4
],
"c": 3.0
}
]

separators 去掉逗号、分号、空格
>>> import json
>>> data=[{'a':'A','b':[2,4],'c':3.0}]
>>> print(json.dumps(data,separators=(',',':')))
[{"a":"A","b":[2,4],"c":3.0}]
>>> import json
>>> data=[{'a':'A','b':[2,4],'c':3.0}]
>>> print(json.dumps(data,separators=(',',':')))
[{"a":"A","b":[2,4],"c":3.0}]

skipkeys 跳过非string的对象
>>> import json
>>> data=[{'a':'A','b':(2,4),'c':3.0,(1,2):'D tuple'}]
>>> try:
... res1=json.dumps(data)
... except Exception as e:
... print(e)
...
keys must be str, int, float, bool or None, not tuple

print(json.dumps(data,skipkeys=True))
[{"a": "A", "b": [2, 4], "c": 3.0}]

ensure_ascii
默认是Ture,ascii编码;False,unicode编码
>>> import json
>>> print(json.dumps("中国")))
"\u4e2d\u56fd"
>>> print(json.dumps("中国",ensure_ascii=False))
"中国"


六、JSON解码
将json格式字符串解码成python对象,我们使用的是json.loads()函数。可以将简单的数据类型解码成python对象。

import json
data = [{'a':'Aasd','b':(2,4),'c':3.0}]
data_json = json.dumps(data)
print("encoding:",data_json)
print("decoding":json.loads(data_json))

编码时,无论是list还是tuple都会转换为json的数组;
解码时,json的数组最终都被转换为python的list.

将类对象编码成json串
>>> class Employee(object):
... def init(self,name,age,sex,tel):
... self.name=name
... self.age=age
... self.sex=sex
... self.tel=tel
... def obj_json(self,obj_instance):
... return{
... 'name':obj_instance.name,
... 'age':obj_instance.age,
... 'sex':obj_instance.sex,
data=[{'a':'A','b':[2,4],'c':3.0}]
>>> print(json.dumps(data,separators=(',',':')))
[{"a":"A","b":[2,4],"c":3.0}]
>>> import json
>>> data=[{'a':'A','b':[2,4],'c':3.0}]
>>> print(json.dumps(data,separators=(',',':')))
[{"a":"A","b":[2,4],"c":3.0}]

skipkeys 跳过非string的对象
>>> import json
>>> data=[{'a':'A','b':(2,4),'c':3.0,(1,2):'D tuple'}]
>>> try:
... res1=json.dumps(data)
... except Exception as e:
... print(e)
...
keys must be str, int, float, bool or None, not tuple

print(json.dumps(data,skipkeys=True))
[{"a": "A", "b": [2, 4], "c": 3.0}]

ensure_ascii
默认是Ture,ascii编码;False,unicode编码
>>> import json
>>> print(json.dumps("中国")))
"\u4e2d\u56fd"
>>> print(json.dumps("中国",ensure_ascii=False))
"中国"


六、JSON解码
将json格式字符串解码成python对象,我们使用的是json.loads()函数。可以将简单的数据类型解码成python对象。

import json
data = [{'a':'Aasd','b':(2,4),'c':3.0}]
data_json = json.dumps(data)
print("encoding:",data_json)
print("decoding":json.loads(data_json))

编码时,无论是list还是tuple都会转换为json的数组;
解码时,json的数组最终都被转换为python的list.

将类对象编码成json串
>>> class Employee(object):
... def init(self,name,age,sex,tel):
... self.name=name
... self.age=age
... self.sex=sex
... self.tel=tel
... def obj_json(self,obj_instance):
... return{
... 'name':obj_instance.name,
... 'age':obj_instance.age,
... 'sex':obj_instance.sex,
... 'tel':obj_instance.tel}
...
emp=Employee('lily',24,'female','18223423423')
print(json.dumps(emp,default=emp.obj_json))
{"name": "lily", "age": 24, "sex": "female", "tel": "18223423423"}
python 中的dict对象可以直接序列化为json的{}。但是很多时候,可能用class表示对象。比如定义Employe类。然后直接去序列化就会报错。
原因,类不是一个可以直接序列化的对象。但是,我们可以使用dumps()函数中default参数来实现。

import json
class Employee(object):
... def init(self,name,age,sex,tel):
... self.name=name
... self.age=age
... self.sex=sex
... self.tel=tel
...
emp=Employee('lily',24,'female','18223423423')
print(emp.dict)
{'name': 'lily', 'age': 24, 'sex': 'female', 'tel': '18223423423'}
print(json.dumps(emp,default=lambda Employee:Employee.dict))
{"name": "lily", "age": 24, "sex": "female", "tel": "18223423423"}
print(json.dumps(emp,default=lambda emp:emp.dict))
{"name": "lily", "age": 24, "sex": "female", "tel": "18223423423"}

使用dict属性

你可能感兴趣的:(python JSON)