在python编程中,我们经常要用到json对象作为数据交换格式。
在json模块中提供了json.load、json.dump、json.loads和json.dumps这四个方法。其中json.dumps和json.loads为json的序列化和反序列化,而json.dump和json.load则是涉及文件操作的序列化存储和反序列化载。其中json.dump和json.dumps是以json.JSONEncoder作为默认编码器,而json.load和json.loads则是以json.JSONDecoder作为默认编码器。在介绍这四个方法之前,我们先介绍一下这两个编解码器:
1.1 JSONEncoder( skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, encoding=‘utf-8’, default=None):
对几个参数进行简要的解释:
- skipkeys: 若赋值False,则遇到str, int, long, float 或者 None类型之外的数据类型就会报TypeError;若赋值True,则跳过这些数据类型。
- ensure_ascii: 默认为True,将所有ascii和非ascii字符都转换为ascii字符,转换的秘诀就是将非ascii字符使用unicode转义符表示,如"好"这个汉字就会用"\u597d"表示;若为False则将所有的非ascii字符都转换为utf8编码字符,如"好"这个汉字就会被编码为"\xe5\xa5\xbd"。
- check_circular:若为False,循环引用检测则会跳过,当出现循环引用是会抛出OverFlow错误。
- allow_nan:若为False则当浮点数超出范围(nan, inf, -inf)就会抛出ValueError。若为True,将使用JavaScript映射(NaN, Infinity, -Infinity)。
- sort_keys:将数据根据keys的值进行排序。这对比较json文件或者json对象有很重要的作用。
- indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json
- separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
- encoding:默认‘utf8’,对ensure_ascii参数为True时,若处理目标为str字节串,则需要对处理目标进行解码并转换成unicode转义符。但是当处理目标是unicode时,序列化的结果都是unicode转义符。
- default:自定义序列化函数
1.2 JSONDecoder (encoding=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
- encoding: 该参数是对json对象中’str’进行解码的编码方式,默认为‘utf-8’,但是当解码‘unicode’对象时该参数没有作用。将json对象反序列化为python对象时,所有的非ascii字符都会被转为unicode字符。
- object_hook: 可以指定函数用来进行自定义反序列化。
- parse_float: 可以指定类型或者解析器对浮点类型类型进行转化,若不指定则使用float()函数。
- parse_int: 可以指定类型或者解析器对整数类型进行转化,若不指定则使用Int()函数。
- parse_constant: 可以指定函数对-Infinity, Infinity, NaN类型进行处理,该参数还可以用来处理一些无效的json数字并抛出异常。
- strict: 默认为True。若为False,则允许字符串中出现控制字符,如’\t’、’\n’、’\r’ 和 '\0’等。
- object_paris_hook: 不了解。
下面首先介绍一下json.dumps和json.loads:
2.1. dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding=‘utf-8’, default=None, sort_keys=False, **kw)
该接口用于json序列化,实例如下:
# coding=utf8
import json
str = '好的' # type(str)为str字节串 '\xe5\xa5\xbd\xe7\x9a\x84'
ustr = u"好的" # type(ustr)为unicode字符串 u'\u597d\u7684'
json.dumps('好的') # 序列化后的json对象 '"\\u597d\\u7684"'
json.dumps(u'好的') # 序列化后的json对象 '"\\u597d\\u7684"'
json.dumps('好的',ensure_ascii=False) # 序列化,'"\xe5\xa5\xbd\xe7\x9a\x84"'
json.dumps(u'好的', ensure_ascii=False) # 序列化,u'"\u597d\u7684"'
json.dumps(u'好的', ensure_ascii=False, encoding='gbk') # 序列化,u'"\u597d\u7684"',对于unicode字符串,encoding参数无效,因为encoding指定的是解码使用的编码方式
json.dumps(u'好的'.encode('gbk'), ensure_ascii=False) #序列化将非ascii符号编码为utf-8字符 '"\xba\xc3\xb5\xc4"'
json.dumps(u'好的'.encode('gbk'), ensure_ascii=True) #会出错,默认使用utf-8对字节串进行解码
json.dumps(u'好的'.encode('gbk'), ensure_ascii=False, encoding='gbk') #序列化后非ascii码将被编码为utf-8码字
2.2. loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
该方法会将json对象反序列化为python对象,但是Python2版本的该方法会将json中string对象转换为unicode对象