python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python JSON数据解析

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

作者:G-1科罗纳

Python作为一种强大的编程语言,提供了多种方法来处理JSON数据,使其在数据解析、处理和生成方面变得异常简便,这篇文章主要介绍了python进阶之JSON数据解析的相关资料,需要的朋友可以参考下

引言

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

一、JSON简介

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

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

例如:

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

注意:

四、异常处理

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数据解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文