JSON格式

JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是JavaScript的子集。JSON用来存储和交换文本信息,易于读写,占用带宽小,网络传输速度快的特性,适用于数据量大不要求保留原有类型的情况。

JSON格式通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而在Python中处理JSON格式的模块有两个,分别是jsonpickle。本文主要学习JSON模块。

JSON的语法规则:

  1. 名称必须用双引号括起来
  2. 值可以是双引号包括的字符串、数字、true、false、null、JavaScript数组,或子对象
  3. 数据在name/value中
  4. 数据见用逗号分隔
  5. 花括号保存对象
  6. 方括号保存数组

JSON模块

在JSON中有四个常用的方法,分别是:dumps(), dump(), loads(), load()。前两个方法将python的数据转换为json格式的字符串反序列化;后两个方法将json格式的字符串转换成python的数据类型。

在使用json这个模块前,首先要导入json库:import json

  • json.load():用于读取json格式的文件,将文件中的数据转换为字典类型;
  • json.dump():用于存入json格式的文件,将字典类型转换为json形式的字符串,无返回;
  • json.dumps():将python中的字典类型转换为字符串类型,返回json字符串;
  • json.loads():将json格式的字符串转换为字典类型的数据。

区别:load()dump()处理的主要是文件,序列化到文件或者从文件反序列化;loads()dumps()处理的是字符串,都是内存操作不涉及持久化。

json.dump()

json.dump():用于存入json格式的文件,将字典类型转换为json形式的字符串,无返回。obj必传,表示待转换的文件,fp必传,表示文件对象。

  1. def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None,
  2. separators=None,encoding='utf-8', default=None, sort_keys=False, **kw)

例子:写入文件有两种方法:

第一种方法:

  1. file_text='{"name":"john","age":22,"sex":"man","address":"USA"}'
  2. json.dump(file_text, open("json.file",'w'))

第二种方法:

  1. file_text='{"name":"john","age":22,"sex":"man","address":"USA"}'
  2. with open("json_file1", "w") as f:
  3. f.write(json.dumps(file_text))
  4. f.close()

json.load()

读取文件中json形式的字符串元素转化为Python类型。fp必选,表示文件对象。

  1. def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None,parse_int=None,
  2. parse_constant=None, object_pairs_hook=None, **kw)

参数详解:

  • fp: 文件描述符,将fp反序列化为Python对象。
  • object_hook: 默认值为None,object_hook是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象。
  • parse_float: 默认值为None,如果指定了parse_float,用来对JSON float字符串进行解码,这可用于为JSON浮点数使用另一种数据类型或解析器。
  • parse_int: 默认值为None,如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器。
  • parse_constant:默认值为None,如果指定了parse_constant,对-InfinityInfinityNaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常。
  • 如果进行反序列化(解码)的数据不是一个有效的JSON文档,将会引发 JSONDecodeError异常。



例子:

  1. with open("json_file1","r") as f:
  2. print(json.load(f))

json.loads()

json.loads() 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。s必传,表示字符串。

  1. def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None,
  2. object_pairs_hook=None, **kw)

参数详解:

  • s: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。
  • encoding: 指定一个编码的格式。

loads也不需要文件描述符,其他参数的含义和load函数的一致。

例子:

  1. >>> import json
  2. >>> file_text='{"name":"john","age":22,"sex":"man","address":"USA"}'
  3. >>> print(file_text)
  4. '{"name":"john","age":22,"sex":"man","address":"USA"}'
  5. >>> print(type(file_text))
  6. str
  7. >>> print(json.loads(file_text))
  8. {'name': 'john', 'age': 22, 'sex': 'man', 'address': 'USA'}
  9. >>> print(type(json.loads(file_text)))
  10. <class 'dict'>

json 类型转换到 python 的类型对照表:

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

json.dumps()

json.dumps() 用于将 Python 对象编码成 JSON 字符串。obj必传,表示文件对象。

  1. def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None,
  2. separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)

参数详解:

  • skipkeys: 如果为True的话,则只能是字典对象,否则会TypeError错误, 默认False
  • ensure_ascii: 确定是否为ASCII编码;
  • check_circular: 循环类型检查,如果为True的话;
  • allow_nan: 确定是否为允许的值;
  • indent: 会以美观的方式来打印,呈现,实现缩进;
  • separators: 对象分隔符,默认为;
  • encoding: 编码方式,默认为utf-8;
  • sort_keys: 如果是字典对象,选择True的话,会按照键的ASCII码来排序。



dump()相比,dump()只是多了一个fp参数。简单说就是dump()需要一个类似文件指针的参数(并不是真正的指针,可以称之为文件对象),与文件操作相结合,即先将Python文件对象转化为json字符串再保存在文件中。
例子:

  1. >>> import json
  2. >>> file_text={ "name":"john", "age":22, "sex":"man", "address":"USA" }
  3. >>> file_text
  4. {'name': 'john', 'age': 22, 'sex': 'man', 'address': 'USA'}
  5. >>> type(file_text)
  6. dict
  7. >>> json.dumps(file_text)
  8. '{"name": "john", "age": 22, "sex": "man", "address": "USA"}'
  9. >>> type(json.dumps(file_text))
  10. str

可以使用参数让 JSON 数据格式化输出:

  1. >>> print(json.dumps(file_text, sort_keys=True, indent=4, separators=(',', ': ')))
  2. {
  3. "address": "USA",
  4. "age": 22,
  5. "name": "john",
  6. "sex": "man"
  7. }

Python 原始类型向 json 类型的转化对照表:

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

参考