JSON 标准库

Posted Juno3550

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 类型的转化对照表

PythonJSON
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 的类型对照表

JSONPython
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 标准库的主要内容,如果未能解决你的问题,请参考以下文章

jstl标签库基础教程及其使用代码

十条jQuery代码片段助力Web开发效率提升

十条jQuery代码片段助力Web开发效率提升

使用标准库Ruby将数据标记到Elasticsearch批量中

Python3---标准库json

5Python标准库系列之json模块