Python常用系统自带库之json解析

摘要

本文介绍了Python系统类库json的几种用法,包含解析、转换、读取、写入、过滤,让我们看代码。

前提条件

  • 导入类库
javascript 复制代码
import json
from datetime import datetime
  • 设置文件编码utf-8

代码示例

1. 打开 JSON 文件

kotlin 复制代码
try:
    with open('data1.json', 'r', encoding='utf-8') as f:
        data = json.load(f)
    print(data) # 解析后的数据,输出: {'name': 'John', 'age': 30, 'city': 'New York', 'hobbies': ['reading', 'traveling', 'gaming']}
    print(type(data))  # 数据类型,输出: <class 'dict'>
except FileNotFoundError:
    print("错误:文件未找到,请检查路径是否正确。")
except json.JSONDecodeError as e:
    print(f"JSON 解析错误:{e}")
except Exception as e:
    print(f"未知错误:{e}")

2.将 Python 字典或列表转换回 JSON 字符串

sql 复制代码
dict_data = {'name': 'John', 'age': 30, 'city': 'New York', 'hobbies': ['reading', 'traveling', 'gaming']} #字典
list_data = ["reading", "cycling", "hiking"] #列表
#格式化打印
"""输出: 
{
    "age": 30,
    "city": "New York",
    "hobbies": [
        "reading",
        "traveling",
        "gaming"
    ],
    "name": "John"
}
[
    "reading",
    "cycling",
    "hiking"
]
"""
print(json.dumps(dict_data, ensure_ascii=False, sort_keys=True, indent=4))
print(json.dumps(list_data, ensure_ascii=False, sort_keys=True, indent=4))
#压缩打印
#输出: {"age": 30, "city": "New York", "hobbies": ["reading", "traveling", "gaming"], "name": "John"}
#输出: ["reading", "cycling", "hiking"]
print(json.dumps(dict_data, ensure_ascii=False, sort_keys=True))
print(json.dumps(list_data, ensure_ascii=False, sort_keys=True))

3.写入 JSON 数据到新文件

python 复制代码
with open('data2.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, sort_keys=True, indent=4)

4.JSON逐行写入文件

python 复制代码
data_list = ['早上','中午','下午']
with open('data3.txt', 'w', encoding='utf-8') as f:
    for item in data_list:
        f.write(json.dumps(item, ensure_ascii=False) + '\n')
# 读取 JSON Lines 文件
with open('data3.txt', 'r', encoding='utf-8') as f:
    for line in f:
        item = json.loads(line)
        print(item)
"""输出: 
早上
中午
下午
"""

5.处理嵌套数据

python 复制代码
json_str = {
    "name": "Alice",
    "age": "30",
    "hobbies": ["reading", "null", "travel"],
    "address": {"city": "New York", "zip": "null"},
    "friends": [{"name": "Bob", "status": "active"}],
    "metadata": {"created_at": "2023-01-01T12:00:00", "tags": ["tech", "null", "life"]}
}

def process_nested(data):
    if isinstance(data, dict):
        for key, value in data.items():
            data[key] = process_nested(value)
    elif isinstance(data, list):
        for i, item in enumerate(data):
            data[i] = process_nested(item)
    elif isinstance(data, str):
        # 示例:将字符串 "null" 替换为 None
        if data.lower() == "null":
            return None
        # 将字符串形式的数字转换为整数或浮点数
        try:
            return int(data)
        except ValueError:
            try:
                return float(data)
            except ValueError:
                pass 
        try:
            dt = datetime.fromisoformat(data)
            return dt.date().isoformat()
        except ValueError:
            pass
    return data

#JSON中,空值必须用null表示(小写),而不是其他语言中的None、nil或undefined
#Python的json模块遵循这一规范,因此在序列化时会将Python的None转换为JSON的 null
cleaned_data = process_nested(json_str)
with open('data4.json', 'w', encoding='utf-8') as f:
    json.dump(cleaned_data, f, ensure_ascii=False, sort_keys=True, indent=4)

6.过滤 JSON 数据

css 复制代码
json_data = {
    "name": "Alice",
    "age": "30",
    "hobbies": ["reading", "null", "travel"],
    "address": {"city": "New York", "zip": "null"},
    "friends": [{"name": "Bob", "status": "active"}],
    "metadata": {"created_at": "2023-01-01T12:00:00", "tags": ["tech", "null", "life"]}
}
filtered_data = {key: value for key, value in json_data.items() if key in ['name', 'age']}
print(filtered_data)  # 输出: {'name': 'Alice', 'age': '30'}
  • 结果展示

总结

以上我们了解了Python系统类库json的几种用法,包含解析、转换、读取、写入、过滤,环绕dumps、dump、loads、load这几个方法展开。

关注公众号:咖啡Beans

在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
付玉祥2 小时前
第 6 章 异常处理与文件操作
python
AI原吾3 小时前
ClaudeCode真经第二章:核心功能深度解析
python·ai编程·claudecode
东方芷兰3 小时前
LLM 笔记 —— 03 大语言模型安全性评定
人工智能·笔记·python·语言模型·自然语言处理·nlp·gpt-3
MediaTea3 小时前
Python 库手册:keyword 关键字查询
开发语言·python
java1234_小锋4 小时前
Scikit-learn Python机器学习 - 模型保存及加载
python·机器学习·scikit-learn
睿思达DBA_WGX4 小时前
使用 python-docx 库操作 word 文档(1):文件操作
开发语言·python·word
jackylzh5 小时前
深度学习中, WIN32为 Windows API 标识,匹配 Windows 系统,含 32/64 位
人工智能·python·深度学习
LateFrames6 小时前
用 【C# + Winform + MediaPipe】 实现人脸468点识别
python·c#·.net·mediapipe
人工干智能9 小时前
科普:Python 中,字典的“动态创建键”特性
开发语言·python