python学习-处理JSON数据

52 阅读6分钟

python学习-处理JSON数据

本文介绍 Python 中如何处理 JSON 格式数据,包括 JSON 的基本结构和数据类型,Python 和 JSON 数据的互转和处理,以及文件读写等操作。

供自己以后查漏补缺,也欢迎同道朋友交流学习。

引言

之前介绍过 CSV 这种表格类型数据,但在很多时候我们还会处理字典类型数据,尤其是 JSON 格式的数据,这也是我们前端最熟悉的一种格式了。

下面我们学习下 Python 中如何处理 JSON 格式数据,包括 JSON 的基本结构和数据类型,Python 和 JSON 数据的互转和处理,以及文件读写等操作。

JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。

它基于 JavaScript 的一个子集,但是 JSON 是独立于语言的文本格式,许多编程语言都支持 JSON 格式的数据交换。

基本结构和数据类型

  • 对象:JSON 对象是一个无序的键值对集合,类似于 Python 中的字典。它由花括号 {} 包围,键值对之间用逗号 , 分隔。
  • 数组:JSON 数组是值的有序集合,类似于Python中的列表。它由方括号 [] 包围,值之间用逗号 , 分隔。
  • 字符串:JSON 中的字符串必须用双引号 " 括起来,可以包含字母、数字、特殊字符等。
  • 数字:JSON 中的数字表示为标准的浮点数或整数。
  • 布尔值:JSON 中的布尔值只有两个:truefalse
  • null:JSON 中的 null 表示一个空值或无值。

JSON的语法规则

  • 双引号:JSON中的字符串和键必须用双引号 " 括起来。
  • 逗号分隔:对象中的键值对和数组中的值必须用逗号 , 分隔。
  • 花括号和方括号:对象用花括号 {} 表示,数组用方括号 [] 表示。
  • 转义字符:特殊字符如引号、反斜杠等需要使用反斜杠 \ 进行转义。
  • 空白字符:JSON中允许使用空白字符(空格、制表符、换行符)来增加可读性,但它们不影响JSON的解析。

Python中JSON模块介绍

序列化(编码)

Python 对象转换成 JSON 字符串

  • json.dumps():将 Python 对象序列化成 JSON 格式的字符串。
  • json.dump():将 Python 对象直接序列化并写入到一个文件中。

反序列化(解码)

JSON 字符串转换成 Python 对象

  • json.loads():将 JSON 格式的字符串反序列化成 Python 对象。
  • json.load():从文件中读取 JSON 格式的数据,并将其反序列化成 Python 对象。

处理JSON数据

  • json.JSONEncoder:定制 JSON 编码器,允许你控制如何将 Python 对象转换成 JSON。
  • json.JSONDecoder:定制 JSON 解码器,允许你控制如何将 JSON 字符串解析成 Python 对象。

异常处理

  • json.JSONDecodeError:当 JSON 解码过程中遇到错误时抛出的异常

Python转成JSON

使用 json.dumps() 方法,是将 Python 对象转换成 JSON 格式字符串的常用方法。

import json

# 定义一个字典
data = {
  "name": "张三",
  "age": 25,
  "city": "北京",
  "hobbies": ["篮球", "足球", "游泳"],
  "is_student": True,
}

# 将字典转换为JSON
print(json.dumps(data, ensure_ascii=False))
# 输出:{"name": "张三", "age": 25, "city": "北京", "hobbies": ["篮球", "足球", "游泳"], "is_student": true}

# 将列表转为JSON(元组也是一样的效果)
print(json.dumps(data.get("hobbies"), ensure_ascii=False))
# 输出:["篮球", "足球", "游泳"]

# 将字符串转为JSON
print(json.dumps(data.get("name"), ensure_ascii=False))
# 输出:"张三"

# 将数字转为JSON(整型和浮点型是一样效果)
print(json.dumps(data.get("age")))
# 输出:25

# 将布尔值转为JSON
print(json.dumps(data.get("is_student")))
# 输出:true

# 将None转为JSON
print(json.dumps(None))
# 输出:null

json.dumps()的参数

参数描述
skipkeys默认为 False。如果为 True,则 dict 的为非字符串类型时不抛出 TypeError,而是跳过该键值对。
ensure_ascii默认为 True。如果为 False,则输出的字符串可以包含非 ASCII 字符。
check_circular默认为 True。如果为 True,则会检查对象中是否存在循环引用,并在存在时抛出 ValueError
allow_nan默认为 True。如果为 True,则 NaNInfinity 会被序列化为它们的字符串表示。
cls指定一个自定义的 JSONEncoder 子类来处理编码。
indent用于美化输出的整数字符串。如果为 None,则输出的字符串不会格式化。如果为非负整数,则每个层级缩进该数量的空格。如果为字符串,则使用该字符串进行缩进。
separators用于指定分隔符的元组。默认为(',', ': '),可以设置为(',', ':')来减少输出的空格。
default一个函数,用于处理无法被直接序列化的类型。
sort_keys默认为 False。如果为True,则会按照键的字典序排序后输出。

JSON转成Python

使用 json.loads() 方法将 JSON 格式的字符串反序列化为 Python 对象。

import json

json_str = '{"name": "张三", "age": 25, "city": "北京"}'
# 转成Python字典
data = json.loads(json_str)
# 输出字典
print(data)
# 输出:{'name': '张三', 'age': 25, 'city': '北京'}

# 转换为Python列表
json_string = '[1, 2, 3, "Python"]'
python_list = json.loads(json_string)
print(python_list)  
# 输出:[1, 2, 3, 'Python']

# 转换为Python字符串
json_string = '"Hello, World!"'
python_string = json.loads(json_string)
print(python_string)  
# 输出:Hello, World!

# 转换为Python整数或浮点数
json_string = '100'
python_int = json.loads(json_string)
print(python_int)  
# 输出:100

json_string = '3.14'
python_float = json.loads(json_string)
print(python_float)  
# 输出:3.14

# 转换为Python布尔值
json_string = 'true'
python_bool = json.loads(json_string)
print(python_bool)  
# 输出:True

json_string = 'false'
python_bool = json.loads(json_string)
print(python_bool)  
# 输出:False

# 转换为Python的None
json_string = 'null'
python_none = json.loads(json_string)
print(python_none)  
# 输出:None

json.loads()的参数

参数描述
cls指定一个自定义的 JSONDecoder 子类来处理解码。
object_hook一个可调用的函数,用于转换解码后的对象。该函数的参数是一个字典,返回值也会被用作最终的解码结果。
parse_float一个函数,用于解析 JSON数字。默认情况下,会将数字解析为 Python 的 int 或 float。
parse_int一个函数,用于解析 JSON整数。默认情况下,会将整数解析为 Python 的 int。
strict默认为 True。如果为 False,则允许一些非标准的 JSON 编码,例如单引号包围的字符串。
object_pairs_hook一个可调用的函数,用于处理 JSON 对象中的键值对列表。该函数的参数是一个键值对列表,返回值会被用作最终的解码结果。

写入JSON文件

使用 json.dump() 方法将 Python 对象写入文件

import json

# 定义一个字典
data = {
  "name": "张三",
  "age": 25,
  "city": "北京",
  "hobbies": ["篮球", "足球", "游泳"],
  "is_student": True,
}

with open('json-1.json', 'w') as file:
  json.dump(data, file, ensure_ascii=False, indent=4)

读取JSON文件

使用 json.load() 方法从文件中读取 JSON 数据

import json

with open('json-1.json', 'r') as file:
  data = json.load(file)
  print(data)
  # 输出:{'name': '张三', 'age': 25, 'city': '北京', 'hobbies': ['篮球', '足球', '游泳'], 'is_student': True}

python学习专栏系列

练习代码库地址

python-study