python对json的操作总结
Json简介
-
Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式。Json最广泛的应用是作为Ajax中服务器与客户端进行通讯的数据格式。简洁和清晰的层次结构使得Json称为理想的数据交换语言。易于人编写和阅读,同时也易于机器解析和生成,并有效地提升了网络传输效率
-
python提供了json模块,通过该模块,可以将字符串形式的json数据转化为字典,也可以将python中的字典数据转化为字符串形式的json数据。python的json模块主要包含了两个功能函数:
-
json.dumps(): 将python对象编码为json字符串
-
json.loads(): 将json字符串解码为python对象
-
Python对象编码为Json对象
-
将python对象编码为json对象,使用的是json模块中的dumps和dump函数,比较常使用的是dumps函数,它们之间的区别就是dumps将python对象编码为json对象后生成的是一个字符串,而dump则是生成一个文件流,这里以dumps函数为例进行说明,具体dumps和dump的区别见另一篇博客
-
dumps()的参数说明:
skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开
sort_keys:将数据根据keys的值进行排序
-
实例
python_dic1 = {'username': 'jiangnanmax', 'nickname': '江', 'major': 'CS'}
json_dic1 = json.dumps(python_dic1)
print(json_dic1)
json_dic2 = json.dumps(python_dic1, sort_keys=True, indent=4, separators=(',', ': '),
ensure_ascii=False)
print(json_dic2)
输出如下:
{"username": "jiangnanmax", "nickname": "\u6c5f", "major": "CS"}
{
"major": "CS",
"nickname": "江",
"username": "jiangnanmax"
}
- 观察对比上面的代码和运行结果,你会发现我定义的python对象中用的都是单引号,而经过dumps函数处理后就都变成了双引号。这是因为python中的json模块不支持使用单引号,在使用dumps函数的时候你可能不会发现有这个情况,继续往下看,在使用loads函数的时候我进行了对比
Json对象解码为Python对象
-
将json对象解码为python对象,使用的是json模块中的loads和load函数,它们之间的区别与dumps和dump之间的区别相同,具体见另一篇博客
-
实例
python_dic1 = {'username': 'jiangnanmax', 'nickname': '江', 'major': 'CS'}
json_dic1 = json.dumps(python_dic1, ensure_ascii=False)
print(json_dic1)
print(type(json_dic1))
输出:
{"username": "jiangnanmax", "nickname": "江", "major": "CS"}
<class 'str'>
python_dic2 = json.loads(json_dic1)
print(python_dic2)
print(type(python_dic2))
输出:
{'username': 'jiangnanmax', 'nickname': '江', 'major': 'CS'}
<class 'dict'>
python_dic2 = str(python_dic2) # 把dict类型转化为str类型
print(json.loads(python_dic2))
报错:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
- 注意:使用python标准库的json解析函数json.loads是不能使用单引号引用的json字符串的,你可以改用双引号,或者在loads之前先调用json.dumps()