JSON(JavaScript Object Notation) 是一种轻量级的通用数据交换格式,起源于JavaScript,现在其他语言都能读写,可跨平台,用于数据存储,易于阅读,形式类似python的字典。
json模块和pickle模块包括的方法相同,功能类似。json和pickle主要不同在于:json是序列化的通用格式,其他编程语言都可以读写,人类可读,但是pickle对象仅限于python使用,因为其序列化结果是乱码,不可读。
注意:json内的规定字符集是UTF-8,存储的字符串和键必须使用""双引号。
python数据类型和json类型转化对照如下表:
Python | json |
---|---|
dict | object |
list,tuple | array |
str | string |
int,long,float | number |
True,False,None | true,false,null |
常用函数
常用函数包括如下四个,其中,dump和load表示和文件进行数据交互;dumps和loads表示和程序中的变量进行数据交互。
序列化(编码)
json.dump(object, file)
json.dumps(object) -> string
dump和dump其他输入参数相似,如下:
skipkeys:默认为False。若为True,则将跳过不是基本类型(str,int,float,bool,None)的dict键。
ensure_ascii:默认为True,将所有传入的非ASCII字符转义输出,否则以原字符输出。
check_circular:默认为True。若为False,则将跳过对容器类型的循环引用检查。
allow_nan:默认为True。若为False,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。若为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。
indent:设置缩进格式,默认为None。若intent≤0或为“”,则插入换行符;indent>0缩进多个空格;indent是字符串,则该字符串用于缩进。
separators: 默认为None,表示默认分隔符:(’,’,’:’)。输入类型是tuple,比如(‘, ’,‘:’)
sort_keys:默认为False,若为True则字典的输出将按键值排序。
反序列化(解码)
json.load(file) -> object
json.loads(string) -> object
示例
dump
import json
a={'aa':123,'bb':456,'cc':789}
#创建d.json文件,将a写入
with open('/root/python workspace/d.json', 'w') as f:
json.dump(a, f)
dumps
import json
a={'你好':1,'ss':"abc",'//':5}
f=json.dumps(a)#写入对象不是文件,而是python变量f
f
#输出:'{"\\u4f60\\u597d": 1, "ss": "abc", "//": 5}' 汉字变成了乱码
f=json.dumps(a,ensure_ascii=False,indent=4)#使用原字符,添加缩进
print(f)
"""
{
"你好": 1,
"ss": "abc",
"//": 5
}
"""
#善用indent可以使输出的json看起来更整齐
注意:dumps返回的是字符串类型,虽然使用print后,看起来像字典。
load
import json
#读取事先建立的d.json文件
with open('/root/python workspace/d.json', 'r') as f:
s=json.load(f)
print(s)
#输出:{'aa': 123, 'bb': 456, 'cc': 789}
**注意:*读取对象文件可以不是.json后缀,但是内部存储的数据格式一定是按照json格式编写的,以键值对的方式,最外层有{},引号是双引号。
loads
import json
json.loads(f)
#输出为上文中的a:{'你好': 1, 'ss': 'abc', '//': 5}