python进阶之JSON数据解析完整示例

 更新时间:2025年12月29日 08:22:51   作者:G-1科罗纳  
Python作为一种强大的编程语言,提供了多种方法来处理JSON数据,使其在数据解析、处理和生成方面变得异常简便,这篇文章主要介绍了python进阶之JSON数据解析的相关资料,需要的朋友可以参考下

引言

在当今数据驱动的世界中,JSON已成为数据交换的事实标准。无论是与 Web API 交互、配置应用程序、存储结构化数据,还是处理来自物联网设备的数据,几乎不可避免地会遇到 JSON 格式。

一、JSON简介

JSON(JavaScript Object Notation)是一种轻量级的、基于文本的数据交换格式。它被设计为易于人阅读和编写,同时也易于机器解析和生成,被广泛应用于各种编程语言和平台之间。

JSON 数据由键值对组成,支持以下几种基本数据类型

  • 对象 (Object): 用花括号 {} 包围,包含零个或多个键值对,键是字符串,值可以是任何有效的 JSON 数据类型。
  • 数组 (Array): 用方括号 [] 包围,包含零个或多个值,值之间用逗号分隔。
  • 字符串 (String): 用双引号 "" 包围的字符序列。
  • 数字 (Number): 整数或浮点数。
  • 布尔值 (Boolean): true 或 false
  • 空值 (Null): null

例如:

people.json文件:

[
  {
    "name": "张三",
    "gender": "男",
    "age": 25
  },
  {
    "name": "李四",
    "gender": "女",
    "age": 23
  }
]

二、python中JSON模块

Python 的 JSON模块是处理 JSON 数据的标准工具。它提供了四个核心函数用于在 JSON 字符串/文件和 Python 对象之间进行转换:

2.1 json.load()

从 JSON文件对象读取并解析为Python 对象。

json.load(fp, *, cls=None, object_hook=None, parse_float=None, 
            parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
  • 参数:
    • fp: 一个支持 .read() 方法的文本文件对象,数据从这个文件对象中读取。
    • cls (可选): 用于自定义 JSON 解码器的类。通常用于处理复杂的对象。
    • object_hook (可选): 一个函数,用于在解码每个 JSON 对象后进行自定义处理。它接收一个字典作为参数,并应返回一个对象(通常是字典或自定义对象)。
    • parse_float (可选): 一个函数,用于将 JSON 中的浮点数字符串转换为 Python 对象。默认是 float
    • parse_int (可选): 一个函数,用于将 JSON 中的整数字符串转换为 Python 对象。
    • parse_constant (可选): 一个函数,用于处理 JSON 常量 ('-Infinity''Infinity''NaN')。
    • object_pairs_hook (可选): 一个函数,接收一个由 (key, value) 对组成的列表,并返回一个对象。object_pairs_hook 优先于 object_hook
    • **kw (可选): 其他关键字参数。
  • 返回值: 一个 Python 对象(通常是 dict 或 list)。

2.2 json.loads()

 从JSON 字符串(str)读取并解析为 Python 对象。

json.loads(s, *, cls=None, object_hook=None, parse_float=None, 
           parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

参数同json.dump。

2.3 json.load()

将 Python 对象 编码为 JSON格式写入文件。

json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, 
            check_circular=True, allow_nan=True, cls=None, indent=None, 
            separators=None, default=None, sort_keys=False, **kw)
  • 参数:
    • obj: 一个必需的参数。要序列化的 Python 对象。它必须是 dictlisttuplestrintfloatboolNone,或者是一个实现了 __json__() 方法的对象。
    • fp: 一个必需的参数。一个支持 .write() 方法的文本文件对象(通常由 open() 函数返回,模式为 'w' 或 'a')。JSON 数据将写入这个文件对象。
    • skipkeys (可选): 如果为 True,当字典的键不是基本类型(strintfloatboolNone)时,会自动跳过该键值对,而不是引发 TypeError
    • ensure_ascii (可选): 如果为 True,输出将确保所有非 ASCII 字符都被转义。如果为 False,则允许直接输出这些字符(通常用于生成人类可读的文件)。
    • check_circular (可选): 如果为 True,会检查容器类型的循环引用(如列表包含自身),如果发现则引发 ValueError。如果为 False,则不检查,但遇到循环引用时行为未定义。
    • allow_nan (可选): 如果为 True,允许 float 类型的 NaNInfinity-Infinity。如果为 False,则在序列化这些值时会引发 ValueError
    • cls (可选): 用于自定义 JSON 编码器的类。
    • indent (可选): 用于美化输出。如果是一个非负整数或字符串(如 '\t'),则 JSON 数组元素和对象成员将被换行并使用该值进行缩进,使其更易读。None(默认)表示单行输出。
    • separators (可选): 一个 (item_separator, key_separator) 元组。默认是 (', ', ': ')。可以设置为 (',', ':') 以减少输出大小(去除空格)。
    • default (可选): 一个函数,用于处理 json 模块无法序列化的对象。该函数应返回一个可序列化的对象,或者引发 TypeError
    • sort_keys (可选): 如果为 True,则字典的输出将按键的字符串表示进行排序。
    • **kw (可选): 其他关键字参数。
  • 返回值: 无 (None)。

2.4 json.dumps()

将 Python 对象 编码为 JSON 字符串(str)。

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, 
           check_circular=True, allow_nan=True, cls=None, indent=None, 
           separators=None, default=None, sort_keys=False, **kw)

参数同json.dump。

三、数据格式转换规则

Python 对象与 JSON 值之间的转换规则是数据处理的关键。

Python-JSON 数据类型映射表

JSON

Python

object

dict

array

list

string

str

number (int)

int

number (real)

float

true

True

false

False

null

None

注意:

  • JSON 的 null 对应 Python 的 None
  • JSON 的 true/false 对应 Python 的 True/False

四、异常处理

JSONDecodeErrorValueError 的一个子类,提供了更丰富的错误信息,当解析 JSON 文档时发生错误(即 JSON 格式不正确)时会引发此异常,这对于调试 JSON 格式问题非常有帮助。

(该异常在 Python 3.5 版本中添加)

exception json.JSONDecodeError(msg, doc, pos)

额外的属性:

  • msg: 未格式化的错误消息(即描述错误原因的文本)。
  • doc: 正在被解析的原始 JSON 文档(字符串)。
  • pos: 在 doc 字符串中,解析失败开始的索引位置(从 0 开始的字符位置)。
  • lineno: 与 pos 位置对应的行号(从 1 开始计数)。
  • colno: 与 pos 位置对应的列号(从 1 开始计数)。

示例:

新建一个bad.json文件:

{
  "name": "Alice",
  "age": 30,  // 这里多了一个逗号
}

尝试解析它:

import json

try:
    with open('bad.json', 'r') as file:
        data = json.load(file)
except json.JSONDecodeError as e:
    print(f"错误消息: {e.msg}")
    print(f"错误位置: 第 {e.lineno} 行, 第 {e.colno} 列")
    print(f"错误索引: {e.pos}")
    # 如果需要,可以打印整个文档或相关部分
    # print(f"文档: {e.doc}")

可能的输出:

错误消息: Expecting property name enclosed in double quotes
错误位置: 第 3 行, 第 2 列
错误索引: 35

五、完整示例

解析第一章节中的people.json文件:

import json

# 1. 定义文件名
filename = 'people.json'
try:
    # 2. 打开文件并读取
    with open(filename, 'r', encoding='utf-8') as file:
        # 3. 使用 json.load() 解析文件内容
        data = json.load(file)
    
    # 4. 打印解析结果,验证数据类型和内容
    print("=== 解析结果 ===")
    print("原始数据类型:", type(data)) # <class 'list'>
    print("解析后的数据 (Python 列表):")
    print(data)
    print("\n") 

    # 5. 访问和使用数据
    print("=== 信息 ===")
    for person in data:
        print(f"{person['name']} - {person['gender']}, {person['age']}岁")

except FileNotFoundError:
    print(f"错误:找不到文件 '{filename}'。")
    print("请确保 'people.json' 文件存在于当前目录,或者检查文件名是否正确。")
except Exception as e:
    print(f"发生未知错误: {e}")

结果:

=== 解析结果 ===
原始数据类型: <class 'list'>
解析后的数据 (Python 列表):
[{'name': '张三', 'gender': '男', 'age': 25}, {'name': '李四', 'gender': '女', 'age': 23}]

=== 信息 ===
张三 - 男, 25岁
李四 - 女, 23岁

参考

到此这篇关于python进阶之JSON数据解析的文章就介绍到这了,更多相关python JSON数据解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 实现定积分与二重定积分的操作

    Python 实现定积分与二重定积分的操作

    这篇文章主要介绍了Python 实现定积分与二重定积分的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python第三方库face_recognition在windows上的安装过程

    Python第三方库face_recognition在windows上的安装过程

    今天为大家介绍下face recognition在Windows系统上安装与使用,但在Windows平台上face recognition性能会有所下降
    2019-05-05
  • python2使用bs4爬取腾讯社招过程解析

    python2使用bs4爬取腾讯社招过程解析

    这篇文章主要介绍了python2使用bs4爬取腾讯社招过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python实现扫描日志关键字的示例

    python实现扫描日志关键字的示例

    下面小编就为大家分享一篇python实现扫描日志关键字的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python原类、类的创建过程与方法详解

    python原类、类的创建过程与方法详解

    在本篇文章里小编给各位分享了关于python原类、类的创建过程与方法的相关知识点内容,有兴趣的朋友们跟着学习参考下。
    2019-07-07
  • Python通过Schema实现数据验证方式

    Python通过Schema实现数据验证方式

    这篇文章主要介绍了Python通过Schema实现数据验证方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 完美解决Python matplotlib绘图时汉字显示不正常的问题

    完美解决Python matplotlib绘图时汉字显示不正常的问题

    今天小编就为大家分享一篇完美解决Python matplotlib绘图时汉字显示不正常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中的hashlib模块解析

    Python中的hashlib模块解析

    这篇文章主要介绍了Python中的hashlib模块解析,hashlib是一个提供字符加密功能的模块,包含MD5和SHA的加密算法,具体支持md5,sha1, sha224, sha256, sha384, sha512等算法, 该模块在用户登录认证方面应用广泛,对文本加密也很常见,需要的朋友可以参考下
    2023-09-09
  • Python对FTP交互封装的实现

    Python对FTP交互封装的实现

    本文主要介绍了Python对FTP交互封装的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Python遗传算法Geatpy工具箱使用介绍

    Python遗传算法Geatpy工具箱使用介绍

    这篇文章主要为大家介绍了Python遗传算法Geatpy工具箱使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论