目录
1 JSON是什么?
1.1 JSON是众多编程语言共同的“简谱”
1.2?JSON是一种高度结构化的文本
2 如何在Python中使用JSON
2.1 内置库json的编码与解码
2.1.1 编码1:将字典编码为JSON字符串
2.1.2 编码2:将自定义类的对象编码为JSON字符串
2.1.3?解码1:将JSON字符串解码为字典
2.1.4 解码2:将JSON字符串解码为自定义类的对象
2.2 requests库处理json的方法
2.3 提取json中数据信息的方法
3 如何在Java中使用JSON
3.1 Gson库和FastJson库的资源下载
3.2 用Gson处理JSON的方法
3.2.1 编码1:将Map对象编码为JSON字符串
3.2.2 编码2:将自定义类的对象编码为JSON字符串
3.2.3?解码1:将JSON字符串解码为Map对象
3.2.4?解码2:将JSON字符串解码为自定义类的对象
3.3 用FastJson处理JSON的方法
3.2.1 编码1:将Map对象编码为JSON字符串
3.2.2 编码2:将自定义类的对象编码为JSON字符串
3.2.3 解码1:将JSON字符串解码为Map对象
3.2.4 解码2:将JSON字符串解码为自定义类的对象
JSON的全称是JavaScript Object Notation,中文翻译是JS对象简谱,是一种轻量级的数据交换格式。JavaScript是多用于Web前端开发的编程语言,支持面向对象的编程(OOP)。JSON从字面上看就是存储JS对象的一种简便、轻量的格式。
提到“简谱”,我们很容易想到音乐中的数字简谱,即使像我这种不懂音乐的人,也会觉得简谱看上去要比各种音符组成的五线谱更容易阅读一些。
JSON不仅能做JS对象的“简谱”, 还能做很多编程语言的“简谱”,而且是它们共同的“简谱”。不同的编程语言的语法是不一样的,因此不同语言编写的程序之间往往“语言不通”,比如:Java看不懂Python对象,Python也看不懂Java对象。为了不同的编程语言能够沟通,比较好的方法是把对象表达为一种简单易读的统一格式。
JSON用键值对的形式存储对象的属性名和属性值,每一个对象都放在一个大括号里。比如我用JSON给自己写一个对象,一个可爱型的女生,具有善良、聪明、开朗等个性,还养了一只2岁的泰迪犬,那么我的对象就有四个属性:性别、类型、个性和狗狗;狗狗也是一个对象,有品种和年龄两个属性。
{
"gender":"female",
"kind":"cute",
"character":["goodness"," intelligent","lively"],
"puppy":{
"breed":"teddy",
"age":2
}
}
当Java或者Python程序员就这点好,可以在程序的世界里随意写对象。好吧,言归正传,JSON表面上看是一个带有大括号、方括号和冒号的某种数据集合,但实际上是一个文本文件。这也是JSON实现跨平台、跨语言交换数据的重要基础。
先想象一个场景,一个广东人跟一个上海人交流,他们互相听不懂对方的方言,但是两人把要说的内容用汉字写下来,立马就明白了对方的意思,这就是汉字的超方言性(笔者的专业是语言学)。
文本就具有类似于汉字的作用。不同的编程语言具有不同的数据结构类型体系,这就造成了互相沟通的障碍。但是所有的编程语言都会支持文本这一最基本的处理信息的类型。对于Python和Java来说,文本类型实际上就是字符串类型。
JSON中数据的组织方式是高度结构化的,结构化的第一个表现是层级性,上面写的那个对象中,对象里面嵌套着对象;在层级性的基础上,同一层级的数据要有对应性和有序性,键值对的格式保证了每一层数据间的对应关系;属性的值也有可能是存储多值的数据集合,其中的数据要排列有序。
我们可以在CSDN主页的XHR请求中观察JSON的层次结构,操作步骤以Google浏览器为例。
第一步:右键“检查” — 点击“Network” — 点击“XHR”;
第二步:重新加载页面 — 在左侧Name栏打开一个请求 — 点开右侧的preview — 观察层级结构
我们看到的那个能够一层层展开的结构,很像Python的字典或者Java的Map。但事实上,是XHR采用JSON格式传输数据。
json是python的内置库,定义了 json.dumps(dict) 和 json.loads(json_str) 两个方法,前者用于将Python数据结构类型编码为json字符串,后者用于将json字符串解码为Python数据结构类型。
我们在1.1中用json写好的那个“对象”与Python字典从外表上看一模一样,先将其写成字典(变量名spouse,就是配偶、对象的意思,哈哈哈),然后编码,方法的参数是Python字典:
import json
# 写一个 字典 类型的“对象”
spouse = {
"gender":"female",
"kind":"cute",
"character":["goodness"," intelligent","lively"],
"puppy":{
"breed":"teddy",
"age":2
}
}
# 将 字典 编码为 json字符串
spouse_json = json.dumps(spouse)
# 打印spouse和spouse_json
print(spouse)
print(spouse_json)
如果我们直接打印,会发现spouse和spouse_json在终端中显示出来的结果一模一样:
{'gender': 'female', 'kind': 'cute', 'character': ['goodness', ' intelligent', 'lively'], 'puppy': {'breed': 'teddy', 'age': 2}}
{"gender": "female", "kind": "cute", "character": ["goodness", " intelligent", "lively"], "puppy": {"breed": "teddy", "age": 2}}
如果我们分别打印二者的数据类型,会发现spouse是dict,spouse_json是str,对于Python来说,json就是一个高度结构化的字符串。
print(type(spouse)) #
print(type(spouse_json)) #
将自定义类的对象转化为JSON字符串要经过一个中间步骤,即先将对象转化为字典,然后再将字典传入json.dumps(dict) 方法。为了简化代码,自定义类就写三个属性作为演示。
import json
# 先自定义一个类
class Spouse:
def __init__(self, gender, kind, character):
self.gender = gender
self.kind = kind
self.character = character
# 类 实例化为一个 对象
spouse = Spouse("female","cute",['goodness', ' intelligent', 'lively'])
# 将 对象 转换为 字典
spouse_dict = spouse.__dict__
# 将 字典 传入 json.dumps(dict)方法
spouse_json = json.dumps(spouse_dict)
print(spouse_json)
print(type(spouse_json))
打印结果如下,成功将Python自定义对象转换为JSON字符串
{"gender": "female", "kind": "cute", "character": ["goodness", " intelligent", "lively"]}