一、什么是json文件
JSON(Java Script Object Notation)是一种通常用于以不会“对系统造成负担”的方式传输数据(主要通过 API)的格式。基本原理是利用文本来记录数据点,并将数据点传输给第三方。
JSON是一种使用文本存储数据对象的格式。换句话说,它是一种数据结构,将对象用文本形式表示出来。尽管它来源自JavaScript,但它已成为传输对象的实际标准。
大多数流行的编程语言都支持JSON格式,包括Python。JSON格式的文件经常用于API传输数据对象。以下是JSON字符串的示例:
{
"name": "United States",
"population": 331002651,
"capital": "Washington D.C.",
"languages": [
"English",
"Spanish"
]
}
在这个例子中,JSON数据看起来像一个Python字典。像字典一样,JSON以键值对的形式传递数据。然而,JSON数据也可以是字符串、数字、布尔值或列表。
在JSON流行之前,XML一直是以文本格式表示数据对象的常见选择。以下是XML格式的相同信息的示例:
<?xml version="1.0" encoding="UTF-8"?>
<country>
<name>United States</name>
<population>331002651</population>
<capital>Washington D.C.</capital>
<languages>
<language>English</language>
<language>Spanish</language>
</languages>
</country>
很明显,JSON代码量更少。这是JSON如此流行的主要原因之一。
JSON建构于两种结构:
json是Javascript中的对象和数组中的对象,本质上来讲就是有特定结构的字符串,所以可以通过这两种结构可以表示各种复杂的结构:
- 1 对象: 对象在js中表示为”{}”括起来的内容,数据结构为{key:value, key:value…}的键值对结构,在面向对象的语言中,key为对象的属性,value为对应属性的值,所以很容易去理解。属性值value可以为:数字、字符串、数组、对象等。
- 2 数组:数组在js中是中括号“[]”括起来的内容,数据结构为[“java”, “javascript”, “vb”….] 取值方式和所有语言一样,使用索引获取,字段值的类型是:数字、字符串、数组、对象等
简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比”名称 / 值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
如果你还不了解 JSON,可以先阅读 JSON 教程。
二、常用接口
Python3 中可以使用 json 模块来对 JSON 数据进行编解码,主要包含了下面4个操作函数:
提示:所谓类文件对象指那些具有read()或者 write()方法的对象,例如,f = open(‘a.txt’,‘r’),其中的f有read()方法,所以f就是类文件对象。
Python的JSON模块有四个主要功能:read(),reads(),load(),和loads()。这些功能常常会让人混淆。最重要的地方是字母“s”代表String。另外,在函数loads()和dumps()中的字母“s”需要分开读,即loads读load-s,dumps()读dump-s。
这是一个快速表格,可帮助您记住这些功能:
- 一般loads用于读取JSON字符串,而load()用于读取文件中的JSON数据。
load()方法接收一个文件对象并返回解析为Python对象的JSON数据。 - 用于编写JSON文件的方法是dump().这种方法与dumps()方法非常相似。唯一的区别是dumps()返回一个字符串,dump()写入一个文件。
类型转化
在json的编解码过程中,python 的原始类型与JSON类型会相互转换,具体的转化对照如下:
- Python 编码为 JSON 类型转换对应表:
- JSON 解码为 Python 类型转换对应表:
三、代码示例
详细内容可阅读 blog
import json
data = {
'name': 'pengjunlee',
'age': 32,
'vip': True,
'address': {'province': 'GuangDong', 'city': 'ShenZhen'}
}
# 1. 将 Python字典类型 转换为 JSON对象
json_str = json.dumps(data)
print(json_str) # 结果 {"name": "pengjunlee", "age": 32, "vip": true, "address": {"province": "GuangDong", "city": "ShenZhen"}}
# 2. 将 JSON对象类型 转换为 Python字典
user_dic = json.loads(json_str)
print(user_dic['address']) # 结果 {'province': 'GuangDong', 'city': 'ShenZhen'}
print(user_dic.keys())
# 3. 将 Python字典 直接输出到 文件
with open('pengjunlee.json', 'w', encoding='utf-8') as f:
json.dump(user_dic, f, ensure_ascii=False, indent=4) # 缩进4个空格
# 4. 将 类文件对象中的JSON字符串 直接转换成 Python字典
with open('pengjunlee.json', 'r', encoding='utf-8') as f:
ret_dic = json.load(f)
print(type(ret_dic)) # 结果 <class 'dict'>
print(ret_dic['name']) # 结果 pengjunlee
- 使用eval()能够实现简单的字符串和Python类型的转化。
user1 = eval('{"name":"pengjunlee"}')
print(user1['name']) # 结果 pengjunlee