当前位置: 首页 > article >正文

【python】json库处理JSON数据

Python的json库用于处理JSON(JavaScript Object Notation)数据格式。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python的json库提供了函数来编码(将Python对象转换为JSON字符串)和解码(将JSON 字符串转换为Python对象)JSON数据。

编码Python对象为JSON字符串

使用json.dumps()方法将Python对象编码为JSON字符串:

import json

data = {
    "name": "Morris",
    "age": 18,
    "mail": "Morris@18.com"
}

# dict -> json
str = json.dumps(data, indent=4)
print(str)

arr = [data, data]
# list -> json
arr_str = json.dumps(arr, indent=4)
print(arr_str)

运行结果如下:

{
    "name": "Morris",
    "age": 18,
    "mail": "Morris@18.com"
}
[
    {
        "name": "Morris",
        "age": 18,
        "mail": "Morris@18.com"
    },
    {
        "name": "Morris",
        "age": 18,
        "mail": "Morris@18.com"
    }
]

indent参数用于美化输出,使JSON字符串更具可读性。

解码JSON字符串为Python对象

使用json.loads()方法将JSON字符串解码为Python对象(通常是字典或列表):

import json

object_str = """
{
    "name": "Morris",
    "age": 18,
    "mail": "Morris@18.com"
}
"""

obj = json.loads(object_str)
print(obj)

array_str = """
[
    {
        "name": "Morris",
        "age": 18,
        "mail": "Morris@18.com"
    },
    {
        "name": "Morris",
        "age": 18,
        "mail": "Morris@18.com"
    }
]
"""
arr = json.loads(array_str)
print(arr)

运行结果如下:

{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}
[{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}, {'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}]

将Python对象写入JSON文件

json.dump()函数也是用于将Python对象编码成JSON格式,但它直接将编码后的数据写入到一个文件中,而不是返回字符串。

import json

data = {
    "name": "Morris",
    "age": 18,
    "mail": "Morris@18.com"
}

# dict -> json file
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

从文件中读取JSON数据

使用json.load()方法从文件中读取JSON数据并将其解析为Python对象:

import json

# json file -> dict
with open('data.json', 'r', encoding='utf-8') as f:
    obj = json.load(f)
    print(obj)

运行结果如下:

{'name': 'Morris', 'age': 18, 'mail': 'Morris@18.com'}

处理复杂对象

有时你可能需要处理包含复杂对象(如自定义类实例)的JSON数据。你可以通过实现自定义的编码器和解码器来处理这些对象。

自定义编码器

要实现自定义编码器,你需要创建一个继承自json.JSONEncoder的类,并重写default方法:

import json
from datetime import datetime

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime("%Y-%m-%d %H:%M:%S")
        # 其他自定义处理
        return json.JSONEncoder.default(self, obj)


data = {
    "name": "Morris",
    "timestamp": datetime.now()
}

json_str = CustomEncoder().encode(data)
print(json_str)

运行结果如下:

{"name": "Morris", "timestamp": "2024-12-31 14:16:55"}

自定义解码器

要实现自定义解码器,你需要创建一个继承自json.JSONDecoder的类,并重写object_hook或object_pairs_hook方法:

import json
from datetime import datetime


def datetime_parser(dct):
    for key, value in dct.items():
        if isinstance(value, str):
            try:
                # 假设日期格式是 "YYYY-MM-DD"
                dct[key] = datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
            except ValueError:
                # 如果不是日期格式,则保持原样
                pass
    return dct


json_str = """
{
    "name": "Morris",
    "timestamp": "2024-12-31 14:16:55"
}
"""

data = json.loads(json_str, object_hook=datetime_parser)
print(data)
print(data['timestamp'])

运行结果如下:

{'name': 'Morris', 'timestamp': datetime.datetime(2024, 12, 31, 14, 16, 55)}
2024-12-31 14:16:55

http://www.kler.cn/a/470877.html

相关文章:

  • 119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
  • 科普CMOS传感器的工作原理及特点
  • Freemarker模板进行判空
  • 51单片机——共阴数码管实验
  • 服务器等保测评审计日志功能开启(auditd)和时间校准
  • Qt 5.14.2 学习记录 —— 삼 初级认识
  • 论文复现6:
  • 微服务框架,Http异步编程中,如何保证数据的最终一致性
  • Linux高并发服务器开发 第九天(gdb调试器/基础指令 栈帧)
  • latex学习记录
  • 网络安全漏洞防护技术原理与应用
  • 【RK3588 Linux 5.x 内核编程】-Misc设备驱动
  • 【JMeter】单接口
  • 关于IDE的相关知识之二【插件推荐】
  • Freemarker模板进行判空
  • 【行空板K10】获得当前所在城市及JSON库的移植:
  • 《机器学习》——逻辑回归基本介绍
  • 122.【C语言】数据结构之快速排序(Hoare排序的优化)
  • 【STM32】VSCode打开STM32工程时结构体和宏报错问题解决
  • Redis数据库——Redis雪崩、穿透、击穿
  • STM32-笔记32-ESP8266作为服务端
  • 设计模式七大设计原则Java 实践
  • 没有图形界面,如何快速部署一个Ubuntu 24.10的Server虚拟机
  • AICMP,开启智能挖矿新时代!
  • Elasticsearch 创建索引 Mapping映射属性 索引库操作 增删改查
  • C++:const和constexpr两个关键字