json模块基本使用
json模块提供了四个方法:dumps、dump、loads、load,用于字符串和Python数据类型间进行转换。其中loads和load方法用于Python对象的反序列化,dumps和dump方法用于Python对象的序列化,接下来对这些方法依次进行介绍。
1. json.loads()
把JSON格式字符串解码转换成Python对象。从JSON类型向Python原始类型转化的对照如表1所示。
表1 JSON向Python转化的类型对照
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number(int) | int,long |
number(real) | float |
true | True |
false | False |
null | None |
以下示例演示了loads方法的使用:
>>> import json
>>> str_list = '[1, 2, 3, 4]'
>>> str_dict = '{"city": "北京", "name": "小明"}'
>>> json.loads(str_list)
[1, 2, 3, 4]
>>> json.loads(str_dict)
{'city': '北京', 'name': '小明'}
2. json.dumps()
实现将Python类型编码为JSON字符串,返回一个str对象。从Python原始类型向JSON类型转化的对照如表2所示。
表2 Python向JSON转化的类型对照
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str, unicode | string |
int,long,float | number |
True | true |
False | false |
None | null |
以下示例演示了dumps方法的使用:
# json_dumps.py
import json
demo_list = [1, 2, 3, 4]
demo_tuple = (1, 2, 3, 4)
demo_dict = {"city": "北京", "name": "小明"}
json.dumps(demo_list)
# [1, 2, 3, 4]
json.dumps(demo_tuple)
# [1, 2, 3, 4]
# 注意:json.dumps() 处理中文时默认使用的ascii编码,会导致中文无法正常显示
print(json.dumps(demo_dict))
# {"city": "\u5317\u4eac", "name": "\u5c0f\u660e"}
# 记住:处理中文时,添加参数 ensure_ascii=False 来禁用ascii编码
print(json.dumps(demo_dict, ensure_ascii=False))
# {"city": "北京", "name": "小明"}
3.json.load()
读取文件中JSON形式的字符串元素,转化成Python类型。它与json.loads()方法的区别在于,一个读取的是字符串,一个读取的是文件。
以下的示例读取一个名为listStr.json和dictStr.json的文件内容,代码如下:
# json_load.py
import json
str_list = json.load(open("listStr.json"))
print(str_list)
# [{u'city': u'\u5317\u4eac'}, {u'name': u'\u5c0f\u660e'}]
str_dict = json.load(open("dictStr.json"))
print(str_dict)
# {u'city': u'\u5317\u4eac', u'name': u'\u5c0f\u660e'}
4.json.dump()
将Python内置类型序列化为json对象后写入文件。它与json.dumps()方法的区别在于写入的是文件还是字符串。
以下示例演示了dump方法的使用:
# json_dump.py
import json
str_list = [{"city": "北京"}, {"name": "小明"}]
json.dump(str_list, open("listStr.json", "w"), ensure_ascii=False)
str_dict = {"city": "北京", "name": "小明"}
json.dump(str_dict, open("dictStr.json","w"), ensure_ascii=False)