JSON 数据格式详解

1. JSON 概念

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式:

  • 人类可读的文本格式
  • 完全独立于编程语言
  • 用于存储和传输结构化数据
  • 广泛应用于API通信、配置文件和数据存储

2. JSON 核心原理

  • 键值对结构:类似字典的概念
  • 树状层级:支持嵌套数据结构
  • 数据类型支持:字符串、数字、布尔值、数组、对象、null
  • 无状态:不包含函数或可执行代码
  • 文本格式:使用纯文本表示,默认UTF-8编码

3. JSON 语法规范

基本结构

json 复制代码
{
  "key1": "value",
  "key2": 42,
  "key3": true,
  "key4": null,
  "key5": ["数组", "元素"],
  "key6": {
    "nested": "嵌套对象"
  }
}

语法规则

  1. 键名:必须用双引号包裹
  2. 字符串值:必须用双引号包裹
  3. 数据类型 :
    • 字符串:"text"
    • 数字:123 或 3.14
    • 布尔值:true 或 false
    • null:null
    • 数组:[值1, 值2]
    • 对象:{"key": value}
  4. 分隔符 :
    • 键值对用冒号 : 分隔
    • 元素用逗号 , 分隔
  5. 不支持特性 :
    • 注释
    • 尾随逗号
    • 十六进制数字

4. JSON API 功能(Python)

核心函数

函数 功能 主要参数
json.dump() 序列化到文件 obj, fp, indent, ensure_ascii
json.dumps() 序列化为字符串 obj, indent, separators, default
json.load() 从文件反序列化 fp, object_hook, parse_float
json.loads() 从字符串反序列化 s, object_hook, parse_int

关键参数说明

  1. 序列化参数:

    • indent:缩进空格数(美化输出)
    • ensure_ascii=False:允许非ASCII字符(如中文)
    • default:自定义对象序列化函数
    • separators=(',', ':'):紧凑格式
  2. 反序列化参数:

    • object_hook:自定义字典转换函数
    • parse_float:自定义浮点数解析
    • parse_int:自定义整数解析

5. JSON 处理流程

json.dumps json.loads json.dump json.load default函数 object_hook Python对象 JSON字符串 Python对象 JSON文件 自定义对象 可序列化字典

6. 应用示例

示例1:基本序列化与反序列化

输入(Python对象):

python 复制代码
data = {
    "server": "web01",
    "status": "online",
    "ports": [80, 443],
    "active": True
}

序列化:

python 复制代码
import json

# 转换为JSON字符串
json_str = json.dumps(data, indent=2)
print(json_str)

输出(JSON字符串):

json 复制代码
{
  "server": "web01",
  "status": "online",
  "ports": [
    80,
    443
  ],
  "active": true
}

反序列化:

python 复制代码
# 从JSON字符串转换回Python对象
restored_data = json.loads(json_str)
print(restored_data["ports"][0])  # 输出: 80

示例2:文件读写

写入JSON文件:

python 复制代码
config = {
    "database": {
        "host": "db.example.com",
        "port": 3306,
        "user": "admin"
    },
    "timeout": 30
}

with open("config.json", "w") as f:
    json.dump(config, f, indent=4)

生成的config.json:

json 复制代码
{
    "database": {
        "host": "db.example.com",
        "port": 3306,
        "user": "admin"
    },
    "timeout": 30
}

读取JSON文件:

python 复制代码
with open("config.json", "r") as f:
    loaded_config = json.load(f)
    print(loaded_config["database"]["host"])  # 输出: db.example.com

示例3:处理自定义对象

自定义设备类:

python 复制代码
class NetworkDevice:
    def __init__(self, name, ip):
        self.name = name
        self.ip = ip

序列化自定义对象:

python 复制代码
def device_encoder(obj):
    if isinstance(obj, NetworkDevice):
        return {"device_name": obj.name, "ip_address": obj.ip}
    raise TypeError("不可序列化的对象")

router = NetworkDevice("core-router", "10.0.0.1")
json_str = json.dumps(router, default=device_encoder)
print(json_str)
# 输出: {"device_name": "core-router", "ip_address": "10.0.0.1"}

反序列化自定义对象:

python 复制代码
def device_decoder(dct):
    if "device_name" in dct and "ip_address" in dct:
        return NetworkDevice(dct["device_name"], dct["ip_address"])
    return dct

device = json.loads(json_str, object_hook=device_decoder)
print(f"{device.name}: {device.ip}")  # 输出: core-router: 10.0.0.1

示例4:处理特殊数据类型

输入(包含日期):

python 复制代码
from datetime import datetime

log_entry = {
    "event": "login",
    "user": "alice",
    "timestamp": datetime.now()
}

自定义序列化:

python 复制代码
def custom_serializer(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    return str(obj)  # 其他类型转为字符串

json_str = json.dumps(log_entry, default=custom_serializer)
print(json_str)

输出:

json 复制代码
{
  "event": "login",
  "user": "alice",
  "timestamp": "2023-11-15T14:30:45.123456"
}

7. 常见错误处理

python 复制代码
invalid_json = "{'key': 'value'}"  # 错误:JSON要求双引号

try:
    data = json.loads(invalid_json)
except json.JSONDecodeError as e:
    print(f"JSON解析错误: {e.msg}")
    print(f"位置: 行 {e.lineno}, 列 {e.colno}")
    # 实际输出: JSON解析错误: Expecting property name enclosed in double quotes

8. 最佳实践

  1. 美化与压缩:

    • 开发环境:使用 indent=2 方便阅读
    • 生产环境:使用 separators=(',', ':') 减少体积
  2. 中文支持:

    python 复制代码
    data = {"name": "服务器"}
    json_str = json.dumps(data, ensure_ascii=False)  # 正确显示中文
  3. 数据类型转换:

    • JSON数字 → Python int/float
    • JSON数组 → Python list
    • JSON对象 → Python dict
    • JSON null → Python None
  4. 安全注意:

    • 不要解析不可信来源的JSON
    • 设置最大解析深度:json.loads(data, max_depth=10)

JSON是现代应用中最常用的数据交换格式,掌握它的基本使用和Python处理技巧,是自动化运维和开发的基础能力。从配置文件到API通信,JSON无处不在!

相关推荐
国科安芯4 小时前
一颗当两颗用:ASC4T245S 的“两组独立 2 位 + 控制挂靠 VCCA“账
网络·电平转换·抗辐射·在轨服务
冯胤清4 小时前
《Jev-IDS:网络入侵检测一种系统模型》论文深度分析总结
网络
卷无止境5 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路5 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师5 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师5 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
Y3815326625 小时前
搜索 API 延迟优化:并发数、超时与超时的真实代价
python·搜索引擎
wangqiaowq6 小时前
PII 脱敏指的是:把个人身份信息(PII)中能识别到具体个人的敏感部分,用替换、遮蔽、变形等方式处理掉,使得数据在保留可用性的同时,不再直接暴露个人身份。
python
91刘仁德6 小时前
HTTP协议详解:从URL到HTTP服务器的完整实战
服务器·网络·笔记·网络协议·http