当前位置:   article > 正文

[JSON] JSON基础知识

json

JSON(JavaScript Object Notation,JavaScript对象表简谱)是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据

JSON文件的文件类型是.json

JSON是纯文本,具有层级结构,易于阅读和编写,其本质是字符串

JSON语法

语法规则

1.数据在名称/值对中

2.数据由逗号 , 分隔

3.使用斜杆 \ 来转义字符

4.大括号 {} 保存对象

5.中括号 [] 保存数组,数组可以包含多个对象

JSON名称/值对 

key : value

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值 

"name" : "Andy"

提示Tips

JSON值可以包括如下类型:

1.数字(整数或浮点数)

2.字符串(在双引号""中)

3.逻辑值(true 或 false)

4.数组(在中括号[]中)

5.对象(在大括号{}中)

6.null

JSON对象

JSON对象在大括号 {} 中书写,对象可以包含多个key/value(键/值)对

key必须是字符串,value可以是合法的JSON数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)

大括号 {} 保存的对象是一个无序的名称/值对集合

一个对象以左括号 { 开始, 右括号 } 结束,每个"键"后跟一个冒号 :,名称/值对使用逗号 ,分隔

JSON对象格式

{key1 : value1, key2 : value2, ... key(N) : value(N)}

JSON对象实例

  1. { "userId":12 }
  2. { "flag":true }
  3. { "runoob":null }
  4. { "name":"Andy", "city":"GuangZhou", "university":"Dalian Maritime University"}

JSON对象中可以包含另外一个JSON对象 

  1. {
  2. "name":"Andy",
  3. "city":"GuangZhou",
  4. "info": {
  5. "blog":"https://blog.csdn.net/Hudas",
  6. "university":"Dalian Maritime University"
  7. }
  8. }
'
运行

JSON数组 

JSON数组在中括号 [] 中书写,数组可包含多个对象

中括号 [] 保存的数组是值(value)的有序集合

JSON中数组值必须是合法的JSON数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)

一个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使用逗号 , 分隔

提示Tips

值(value)可以是双引号括起来的字符串(string)、数值(number)、布尔值(true或false)、 null、对象(object)或者数组(array),它们是可以嵌套

JSON数组格式

  1. [
  2. { key1 : value1-1 , key2:value1-2 },
  3. { key1 : value2-1 , key2:value2-2 },
  4. { key1 : value3-1 , key2:value3-2 },
  5. ...
  6. { key1 : valueN-1 , key2:valueN-2 },
  7. ]

JSON数组实例

  1. {
  2. "name":"网站",
  3. "num":3,
  4. "sites":[ "Google", "Baidu", "Taobao" ]
  5. }
'
运行
  1. {
  2. "info": [
  3. { "name":"Andy" , "city":"GuangZhou" },
  4. { "name":"Jack" , "city":"ShenZhen" },
  5. { "name":"Summer" , "city":"ShangHai" }
  6. ]
  7. }
'
运行

在上面的例子中,对象info是包含三个对象的数组,每个对象代表一条关于某个用户信息(name、city)的记录 

JSON对象中数组可以包含另外一个数组,或者另外一个JSON对象

  1. {
  2. "name":"网站",
  3. "num":3,
  4. "sites": [
  5. { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] },
  6. { "name":"Baidu", "info":[ "Baidu 搜索", "Baidu 地图" ] },
  7. { "name":"Taobao", "info":[ "淘宝", "网购" ] }
  8. ]
  9. }
'
运行

读取JSON文件

假设我们有一个名称为name.json的文件如下所示

{"name":"Andy", "age":18, "home":"Guangzhou"}'
运行

通过key来读取Json中对应的value

  1. import json
  2. with open('name.json','r',encoding='utf-8') as f:
  3. obj = json.load(f)
  4. print(type(obj)) # <class 'dict'>
  5. print(obj["name"]) # Andy
  6. print(obj["age"]) # 18
  7. print(obj["home"]) # Guangzhou
  8. f.close()

写入JSON文件

创建一个类似Json的数据,并写入到hobby.json文件中

  1. import json
  2. dicts = {}
  3. dicts["name"] = "Andy"
  4. dicts["hobbys"] = ["football", "table tennis", "swimming", "badminton"]
  5. with open('hobby.json', 'w', encoding='utf-8') as f:
  6. json.dump(dicts, f)
  7. f.close()
'
运行

可以看到会生成一个hobby.json

{"name": "Andy", "hobbys": ["football", "table tennis", "swimming", "badminton"]}'
运行

Python使用JSON实现序列化和反序化 

通过文件操作,我们可以将字符串写入到一个本地文件。但是,如果是一个对象(列表、字典、元组等)就无法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到本地文件里

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换 

使用JSON实现序列化

  1. file = open(r'C:\Users\X2001565\Desktop\demo.txt','w')
  2. names = ['Andy','Jack','Lee','Rita','Bob','Harry','Ruby']
  3. # 报错,不能直接将列表写入到文件里
  4. # TypeError: write() argument must be str, not list
  5. file.write(names)

将上述代码进行修改

  1. import json
  2. file = open(r'C:\Users\X2001565\Desktop\demo.txt','w')
  3. names = ['Andy','Jack','Lee','Rita','Bob','Harry','Ruby']
  4. # 调用json的dumps方法,传入一个对象参数
  5. result = json.dumps(names)
  6. # dumps方法得到的结果是一个字符串
  7. print(type(result)) # <class 'str'>
  8. # 将字符串写入到文件里
  9. file.write(result)
  10. file.close()
'
运行

打开'demo.txt'文件

json.dumps方法的作用是把对象转换成为字符串(可理解为将Python对象编码成JSON字符串),它本身不具备将数据写入到文件的功能 

提示Tips

json.dump方法可以在将对象转换成为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件里

  1. import json
  2. file = open(r'C:\Users\X2001565\Desktop\newdemo.txt','w')
  3. names = ['Abc','Bcd','Cde','Def','Efg']
  4. # dump方法可以接收一个文件参数,在将对象转换成为字符串的同时写入到文件里
  5. json.dump(names,file)
  6. file.close()
'
运行

Python使用JSON实现反序列化

json.loads方法需要一个字符串参数,用来将一个字符串加载成为Python对象(可理解为将已编码的JSON字符串解码为Python对象)

  1. import json
  2. # 调用loads方法,传入一个字符串,可以将这个字符串加载成为Python对象
  3. result = json.loads('["Andy","Jack","Lee","Rita","Bob","Harry","Ruby"]')
  4. # <class 'list'>
  5. print(type(result))
'
运行

json.load方法可以传入一个文件对象,用来将一个文件对象里的数据加载成为Python对象

  1. import json
  2. # 以可读方式打开一个文件
  3. file = open(r'C:\Users\X2001565\Desktop\demo.txt','r')
  4. # 调用load方法,将文件里的内容加载成为一个Python对象
  5. result = json.load(file)
  6. # ['Andy', 'Jack', 'Lee', 'Rita', 'Bob', 'Harry', 'Ruby']
  7. print(result)
  8. file.close()

扩展补充:JSON和Python内置的数据类型对应如下所示

Python字典与Json相互转换

json.dumps()可以将字典转为JSON字符串

  1. import json
  2. # 初始化一个字典数据
  3. dict_ = {
  4. 'name': 'Andy',
  5. 'age': 18,
  6. 'skills': ['Python', 'SQL', 'Power BI', 'Kettle'],
  7. 'major': '信息管理与信息系统',
  8. 'gender': '男',
  9. 'school': 'DMU'
  10. }
  11. json_dict1 = json.dumps(dict_)
  12. # {"name": "Andy", "age": 18, "skills": ["Python", "SQL", "Power BI", "Kettle"], "major": "\u4fe1\u606f\u7ba1\u7406\u4e0e\u4fe1\u606f\u7cfb\u7edf", "gender": "\u7537", "school": "DMU"}
  13. print(json_dict1)
  14. json_dict2 = json.dumps(dict_, indent=2, sort_keys=True, ensure_ascii=False)
  15. '''
  16. {
  17. "age": 18,
  18. "gender": "男",
  19. "major": "信息管理与信息系统",
  20. "name": "Andy",
  21. "school": "DMU",
  22. "skills": [
  23. "Python",
  24. "SQL",
  25. "Power BI",
  26. "Kettle"
  27. ]
  28. }
  29. '''
  30. print(json_dict2)
'
运行

json.loads()可以将json字符串转化成字典 

  1. dict_from_json1 = json.loads(json_dict1)
  2. # {'name': 'Andy', 'age': 18, 'skills': ['Python', 'SQL', 'Power BI', 'Kettle'], 'major': '信息管理与信息系统', 'gender': '男', 'school': 'DMU'}
  3. print(dict_from_json1)
  4. dict_from_json2 = json.loads(json_dict2)
  5. # {'age': 18, 'gender': '男', 'major': '信息管理与信息系统', 'name': 'Andy', 'school': 'DMU', 'skills': ['Python', 'SQL', 'Power BI', 'Kettle']}
  6. print(dict_from_json2)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/930651
推荐阅读
相关标签
  

闽ICP备14008679号