JSON 标准库

1. 序列化的简单概念

2. JSON 标准库

2.1 json.dumps()

2.2 json.loads()

2.3 json.dump()

2.4 json.load()

 

  

1. 序列化的简单概念

我们平常对 python 对象所进行的操作是在内存中的,当程序关闭时这些对象就会被清空,所以我们需要用一种合适的方法将这些数据保存下来。

为了将我们的数据进行永久存储,需要引入序列化(pickling/serialization)的概念。

  • 序列化的定义:将 python 对象编码成一个二进制数据集合(数据流);反序列化:将数据流解码成 python 对象。
  • 序列化的好处:我们可以通过网络或本地存储介质将这些数据流进行传输或保存。
  • 序列化的方法:引入 json、pickling、marshal、shelve 等,其中最常用的是 json。

  

2. JSON 标准库

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写。

基本用法

序列化方法

  • json.dumps():处理的是python对象,将 python 对象序列化为 json 字符串。
  • json.dump():处理的是文件对象,将序列化后的 json 字串保存到文件。

反序列化方法

  • json.loads():处理的是python对象,将已编码的 json 字符串反序列为 python 对象。
  • json.load():处理的是文件对象,从文件接收 json 字串并反序列化为 python 对象。

  

2.1 json.dumps()

将 python 对象编码(序列化)成 json 字符串。

语法

json.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)

较重要的参数:

  • sort_keys:是否排序
  • indent:定义缩进大小
  • separators:是一个元组,定义分隔符的类型
  • skipkeys:是否允许json字串编码字典对象时,字典的key不是字符串类型(默认是不允许)

示例:

1 >>> import json
2 >>> json.dumps({"name":"xiaoming", "age": 18})  # 将字典对象编码成json串(即字符串类型)
3 {"name": "xiaoming", "age": 18}
4 >>> json.dumps([])  # 将列表对象编码成json串
5 []
6 >>> json.dumps("string")  # 将字符串对象编码成json串
7 "string"
8 >>> json.dumps(1)  # 将数字对象编码成json串
9 1

使用参数让 json 数据格式化输出

示例1:

1 >>> print(json.dumps({b: Runoob, a: 7}, sort_keys=True, indent=4, separators=(,, : )))
2 {
3     "a": 7,
4     "b": "Runoob"
5 }

示例2:

 1 >>> a = [foo, {bar: (baz, None, 1.0, 2)}]
 2 >>> print(json.dumps(a, sort_keys=True, indent=4, separators=(!, ?)))  # 分隔符这里只是测试,一般保持默认逗号和分号即可
 3 [
 4     "foo"!
 5     {
 6         "bar"?[
 7             "baz"!
 8             null!
 9             1.0!
10             2
11         ]
12     }
13 ]

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

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

  

2.2 json.loads()

将 json 字串解码成 python 的数据类型,也就是反序列化。

语法

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

示例

1 >>> import json
2 >>> jsonData = {"a":1,"b":2,"c":3,"d":4,"e":5}
3 >>> type(jsonData)
4 <class str>
5 >>> rep = json.loads(jsonData)
6 >>> rep
7 {a: 1, b: 2, c: 3, d: 4, e: 5}
8 >>> type(rep)
9 <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

  

2.3 json.dump()

将序列化之后的JSON字串保存到文件中。

json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, 
  allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

示例:

 1 import json
 2 
 3 data = {"name":"xiaoming", "age":21, "gender":"boy"}
 4 
 5 # 第一种方法:使用json.dumps()
 6 with open("e:\\json1.txt", "w") as f:
 7     f.write(json.dumps(data, indent=4))
 8 
 9 # 第二种方法:使用json.dump()
10 with open("e:\\json2.txt", "w") as f:
11     json.dump(data, f, indent=4)

执行结果(文件内容):

{
    "name": "xiaoming",
    "age": 21,
    "gender": "boy"
}

  

2.4 json.load()

从文件中接收 JSON 串,并反序列化为 Python 的数据类型。

json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

示例:

 1 import json
 2 
 3 data = {"name":"xiaoming", "age":21, "gender":"boy"}
 4 
 5 # 将json串写入文件中
 6 with open("e:\\json3.txt", "w") as f:
 7     json.dump(data, f, indent=4)
 8 
 9 ## 读取json串
10 
11 # 方法1:json.loads()
12 with open("e:\\json3.txt", "r") as f:
13     print(json.loads(f.read()))
14 
15 # 方法2:json.load(open())
16 print(json.load(open("e:\\json3.txt")))
17 
18 # 方法3:json.load() + with open()
19 with open("e:\\json3.txt") as f:
20     print(json.load(f))

 

JSON 标准库

上一篇:WEB基础——接收后台文件方法


下一篇:Spring下@ResponseBody响应中文内容乱码问题