json.load json.dump 和 json.loads json.dumps 全解析

在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):

对几个参数进行简要的解释:

  1. skipkeys: 若赋值False,则遇到str, int, long, float 或者 None类型之外的数据类型就会报TypeError;若赋值True,则跳过这些数据类型。
  2. ensure_ascii: 默认为True,将所有ascii和非ascii字符都转换为ascii字符,转换的秘诀就是将非ascii字符使用unicode转义符表示,如"好"这个汉字就会用"\u597d"表示;若为False则将所有的非ascii字符都转换为utf8编码字符,如"好"这个汉字就会被编码为"\xe5\xa5\xbd"。
  3. check_circular:若为False,循环引用检测则会跳过,当出现循环引用是会抛出OverFlow错误。
  4. allow_nan:若为False则当浮点数超出范围(nan, inf, -inf)就会抛出ValueError。若为True,将使用JavaScript映射(NaN, Infinity, -Infinity)。
  5. sort_keys:将数据根据keys的值进行排序。这对比较json文件或者json对象有很重要的作用。
  6. indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json
  7. separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
  8. encoding:默认‘utf8’,对ensure_ascii参数为True时,若处理目标为str字节串,则需要对处理目标进行解码并转换成unicode转义符。但是当处理目标是unicode时,序列化的结果都是unicode转义符。
  9. default:自定义序列化函数
    json.load json.dump 和 json.loads json.dumps 全解析_第1张图片
1.2 JSONDecoder (encoding=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
  1. encoding: 该参数是对json对象中’str’进行解码的编码方式,默认为‘utf-8’,但是当解码‘unicode’对象时该参数没有作用。将json对象反序列化为python对象时,所有的非ascii字符都会被转为unicode字符。
  2. object_hook: 可以指定函数用来进行自定义反序列化。
  3. parse_float: 可以指定类型或者解析器对浮点类型类型进行转化,若不指定则使用float()函数。
  4. parse_int: 可以指定类型或者解析器对整数类型进行转化,若不指定则使用Int()函数。
  5. parse_constant: 可以指定函数对-Infinity, Infinity, NaN类型进行处理,该参数还可以用来处理一些无效的json数字并抛出异常。
  6. strict: 默认为True。若为False,则允许字符串中出现控制字符,如’\t’、’\n’、’\r’ 和 '\0’等。
  7. object_paris_hook: 不了解。
    json.load json.dump 和 json.loads json.dumps 全解析_第2张图片

下面首先介绍一下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对象

你可能感兴趣的:(python,json.loads,json.dumps,ensure_ascii)