如何在Python中解析JSON
基础知识简介:
JSON代表 JavaScript对象表示法 ,它是一种用于存储和交换数据(交互)的标准句法风格。 JSON的句法仅仅是简单的文本,使其更高级。它源自JavaScript,但可以独立于使用的编程语言。数据存储是通过使用几乎所有编程语言中使用的两种数据结构之一来实现的:
- 键值对 也称为对象、记录、结构、哈希表、键控列表或字典。
- 有序集合 ,如数组、向量或列表。
JSON文件的扩展名是.json,并且网络传输具有广泛的电子和数字系统应用。程序员必须将数据解析为某种编程语言,以便使用JSON文件中的易读数据。几乎所有编程语言中都有内置的软件/模块与这些文件进行交互。
JSON数据表示示例
{
"StudentName": "Raghav",
"Course": "Electronics",
"isAlive": true,
"Year": 3,
"Place": "Chennai",
"Grades":
[
{"1-1": "9.2"},
{"1-2": "9.1"},
{"2-1": "8.9"},
{"2-2": "9.0"}
]
}
如上所示,JSON文件以键值对和列表数组等序列的形式存储数据。
本教程将解释Python解析JSON文件的方法。
包:json
Python内置了一个用于与这些文件交互的包,称为“json”。程序员必须将此包导入到代码中以使用json文件中的数据。
因此,程序员必须从以下第一行代码开始:
import json
在Python中与json文件中的等效数据类型
Python | JSON |
---|---|
字典 | 对象 |
字符串 | 字符串 |
列表和元组 | 数组 |
整数,长整数,浮点数,双精度 | 数字 |
True | true |
False | false |
None | null |
在上述以JSON文件表示的学生信息中,使用了数字、字符串和数组。在Python中使用JSON文件时,有两种可能的机制:
- 序列化或编码
- 反序列化或解码
- 序列化 是指将Python对象编码为它们的等效JSON字节系列,以通过网络传输数据。
- 反序列化 则是指将JSON字节解码为等效的Python对象。
- 在JSON包中,有两种方法可以简化这些进程:
- 对于编码:json.dump()和json.dumps()
- 对于解码:json.load()和json.loads()
本文讨论的是反序列化的解析概念。
- 解析 意味着将文件组件分解成部分,并将JSON数据解码成相应的编程语言,这里是Python。
load()和loads()
1. load()方法的目的是读取给定的JSON文件。
语法:
json.load(file_object)
2. loads()方法的目的是将JSON文件中的数据转换为Python字典,从而解码数据。
语法:
json.loads(string/byte/byte array in a JSON file)
示例:
import json
json_string = """{
"StudentName": "Raghav",
"Course": "Electronics",
"isAlive": true,
"Year": 3,
"Place": "Chennai",
"Grades":
[
{"1-1": "9.2"},
{"1-2": "9.1"},
{"2-1": "8.9"},
{"2-2": "9.0"}
]
}
"""
python = json.loads(json_string)
print(Python)
输出:
要记住的事项:
我们提供给loads()的JSON对象可以是字符串、字节或字节数组,但不能是字典。在上面的代码中,使用”””提供了一个多行字符串。
- 使用在线JSON验证网站检查JSON表示是否正确。
load()和loads()之间的区别
load()和loads()都将JSON数据反序列化为Python字典。区别在于 load()方法接受一个文件作为输入 ,读取该文件并将其转换为Python字典 。相反,loads()方法接受JSON数据 ,以本地JSON字符串/字节或字节数组的形式作为输入,并将其转换为Python字典。
在Python中读取JSON文件
假设某些JSON数据存储在文件中,比如”samplefile.json”。要解析文件的数据,我们需要使用load()方法读取文件。
代码:
import json
with open ('samplefile.json', 'r') as jsonfile:
data = json. load (jsonfile)
print (data)
输出:
load()和loads()的扩展语法
load()
json. load (fp, cls = None, object_hook = None, parse_float = None, parse_int = None, parse_constant = None, object_pairs_hook = None, **kw)
- fp: 从文件读取JSON数据的文件指针。
- object_hook: 通过指定此参数的类型将JSON数据解码为指定的类型。默认情况下设置为None。它通常用于创建不同需求的自定义解码器。
- parse_float、parse_int和parse_constant: 当文件中需要解码JSON浮点数、整数和常数时,会调用这三个参数。这三个参数默认值都为None。
- object_pairs_hook: 这与object_hook参数类似。它用于创建自定义解码器,但区别在于,在这里,JSON字符串将被解析为元组列表,而在object_hook中,它被解析为字典。通过使用此参数,可以避免重复的键。
loads()
json. loads (s, encoding = None, cls = None, object_hook = None, parse_float = None, parse_int = None, parse_constant = None, object_pairs_hook = None, **kw)
s: 要解析的JSON数据
- 其他参数和load()方法中的参数一样。
object_hook和object_pairs_hook参数:
import json
json_string = """{
"StudentName": "Raghav",
"Course": "Electronics",
"isAlive": true,
"Year": 3,
"Place": "Chennai"
}"""
json. loads (json_string, object_pairs_hook = print)
json. loads (json_string, object_hook=print)
输出:
理解:
当打印object_pairs_hook参数时,JSON数据解析为一个字典;当打印object_hook参数时,JSON数据解析为一个元组的列表。