Python JSON模块

JSON 的基础知识

JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,它是一种轻量级的数据交换格式。JSON 的数据格式既适合人来读写,也适合计算机本身解析和生成。最早的时候,JSON 是 JavaScript 语言的数据交换格式,后来慢慢发展成一种语言无关的数据交换格式,这一点非常类似于 XML。

JSON 主要在类似于C 的编程语言中广泛使用,这些语言包括 C、C++C#、Java、JavaScript、Perl、Python 等。JSON 提供了多种语言之间完成数据交换的能力,因此,JSON 也是一种非常理想的数据交换格式。

Python JSON 模块

json 模块提供了对 JSON 的支持,它既包含了将 JSON 字符串恢复成 Python 对象的函数,也提供了将 Python 对象转换成 JSON 字符串的函数。

当程序把 JSON 对象换成 Python 对象时,转换关系如表 1所示:

表1 JSON 类型转换Python 类型的对应关系
JSON 类型Python 类型
对象(object) 字典(dict)
数组(array) 列表(list)
字符串(string) 字符串(str)
整数(number(int))  整数(int)
实数(number(real)) 浮点数(float)
true True
false False
null  None

当程序把 Python 对象转换成 JSON 格式字符串时,转换关系如表2所示:

表 2 Python 类型转换 JSON 类型的对应关系
Python 类型JSON 类型
字典(dict) 对象(object)
列表(list)和元组(tuple) 数组(array)
字符串(str) 字符串(string)
整型、浮点数(float,int) 数值型(number)
True true
False false
None null

序列化和反序列化

要知道JSON的应用场景,先要了解两个概念,即序列化和反序列化。什么是序列化,什么是反序列化呢?

举个栗子,很多人在玩王者荣耀游戏的时候,团战正激烈进行中,突然有急事要处理,如果不及时处理的话会产生一系列麻烦的后果。那怎么办呢?这时候玩家通常会选择挂起。游戏挂起,相当于把当时的状态保存在一个文件里,并把该文件保存到硬盘里,而这个过程就称为序列化。等你完事后回来,取消挂起继续游戏,就相当于把早先保存在硬盘里的文件数据提取了出来,这个过程就是反序列化。

可见,序列化和反序列化的优点有两个:一是便于存储,一是便于传输

1. 便于存储

    序列化过程将文本信息转变为二进制数据流。这样信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,再将其反序列化便可以得到原始的数据。

2. 便于传输

    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论何种类型的数据,都会以二进制序列的形式在网络上传送。

JSON函数的应用场景

使用 JSON 函数需要导入 json 库:import json

函数

描述

json.dumps

将 Python 对象编码成 JSON 字符串,即把dict类型的数据转换成str类型

json.dump

将Python 对象编码成 JSON 字符串(即把dict类型的数据转成str),并写入到json文件中

json.loads

将已编码的 JSON 字符串解码为 Python 对象,即把str类型的数据转换成dict类型

json.load

从已编码的 JSON 文件中读取数据并反序列化

json.dumps

json.dumps 用于将 Python 对象编码成 JSON 字符串。

# 简单编码,将dict类型的数据转成str
print(json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]))    
# ["foo", {"bar": ["baz", null, 1.0, 2]}]


# 参数sort_keys=True可以将字典排序 print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) # {"a": 0, "b": 0, "c": 0}

# 参数separators=('','')可以自定义分隔符 print(json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':'))) # [1,2,3,{"4":5,"6":7}]

# 参数indent可以增加缩进,增强可读性,但缩进空格会使数据变大 print(json.dumps({'4': 5, '6': 7}, sort_keys=True,indent=2, separators=(',', ': '))) # { # "4": 5, # "6": 7 # }
# 参数skipkeys可以忽略非str类型的key。dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型则会抛出TypeError异常,如果开启该参数并设为True,会忽略这个key。 data = {'a':1,(1,2):123} print(json.dumps(data,skipkeys=True)) #{"a": 1}

json.dump

json.dump 用于将Python 对象编码成 JSON 字符串(即把dict类型的数据转成str),并写入到json文件中。

 

 将dict类型对象序列化并保存到文件:

1 import json
2 
3 info = {
4     'name':'alex',
5     'age':'22'
6 }
7 
8 with open('test.test',"w") as f:
9     json.dump(info,f)

执行代码后,test.test文件内容数据如下:

{"name": "alex", "age": "22"}

json.loads

 

json.loads 将已编码的 JSON 字符串解码为 Python 对象。

 

1 import json
2 
3 obj = ['foo', {'bar': ('baz', None, 1.0, 2)}]
4 a = json.dumps(obj)         # 先序列化
5 print(a)
6 # ["foo", {"bar": ["baz", null, 1.0, 2]}]   # JSON 类型
7 
8 print(json.loads(a))        # 再反序列化
9 # ['foo', {'bar': ['baz', None, 1.0, 2]}]    # Python 类型

 

 

json.load

 

json.loads 用于从已编码的 JSON 文件中读取数据并反序列化。

 

import json

f = open("test.test","r")
data= json.load(f)
print(data)               # {'name': 'alex', 'age': '22'}
print(type(data))         # <class 'dict'>

# 索引字典中指定key对应的value
print(data['age'])        # 22

-END-

原文地址:https://www.cnblogs.com/wujiaqing/p/10766811.html