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

JSON:数据交换格式

目录

一、什么是 JSON?

二、JSON 语法规则:简单到不用记

三、JSON 支持的数据类型

四、一个完整的 JSON 示例

五、JSON 的常见应用场景

1. 前后端数据交互

2. 配置文件

3. 跨服务数据传输

六、如何处理 JSON?(主流语言工具)

1. JavaScript(原生支持)

2. Java(Jackson / Fastjson)

3. Python(内置 json 模块)

七、JSON 最佳实践(避坑指南)

八、总结


在现代软件开发中,数据交换无处不在 —— 前后端通信、跨服务调用、配置文件存储…… 而 JSON(JavaScript Object Notation) 凭借其简洁、易读、跨语言的特性,成为了当下最流行的数据交换格式。无论你是前端开发者、后端工程师,还是测试人员,掌握 JSON 都是必备技能。

一、什么是 JSON?

JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,诞生于 2001 年,由 Douglas Crockford 设计。它基于 JavaScript 的对象语法,但独立于编程语言 —— 几乎所有主流语言(Java、Python、Go、JavaScript 等)都有解析和生成 JSON 的库。

核心优势

  • 简洁清晰:比 XML 更紧凑,可读性强,减少数据传输量。
  • 跨语言兼容:不依赖特定语言,任何语言都能轻松处理。
  • 易于解析:结构规则简单,解析效率高,适合网络传输。

二、JSON 语法规则:简单到不用记

JSON 的语法规则非常简单,记住这几点就能轻松上手:

  1. 数据以键值对(key-value)形式存在
    键(key)必须用双引号包裹,值(value)可以是多种类型(见下文)。
    例:"name": "张三"

  2. 多个键值对用逗号分隔
    注意:最后一个键值对后不能加逗号(否则会报错)。

  3. 对象用大括号 {} 包裹
    表示一个 “实体”(如用户、商品),内部是键值对的集合。

  4. 数组用方括号 [] 包裹
    表示一组有序数据,元素可以是任意 JSON 数据类型。

  5. 区分大小写
    键名、关键字(如 true)必须严格小写。

三、JSON 支持的数据类型

JSON 只支持 6 种基本数据类型,覆盖绝大多数场景:

类型说明示例
字符串必须用双引号包裹,支持转义字符(\n\" 等)"username": "zhangsan"
数字整数或浮点数,不支持八进制 / 十六进制"age": 25"price": 99.9
布尔值只有 true(真)或 false(假)"isVip": true
数组有序集合,元素可以是任意 JSON 类型"hobbies": ["读书", "跑步"]
对象无序键值对集合,可嵌套其他对象或数组"address": {"city": "北京"}
null表示空值(注意:不是字符串 "null")"avatar": null

四、一个完整的 JSON 示例

以下是一个 “用户信息” 的 JSON 示例,包含了所有数据类型,直观感受一下:

{"userId": 1001,"username": "张三","age": 28,"isVip": true,"address": {"province": "北京","city": "北京市","detail": "海淀区中关村"},"hobbies": ["篮球", "编程", "旅行"],"lastLoginTime": "2023-10-01 08:30:00","extInfo": null
}

这个 JSON 描述了一个用户的基本信息:

  • 包含简单值(userIdage)、布尔值(isVip);
  • 嵌套了对象(address)和数组(hobbies);
  • 用 null 表示空值(extInfo)。

五、JSON 的常见应用场景

JSON 几乎渗透到软件开发的各个环节,以下是最典型的场景:

1. 前后端数据交互

前端(如 JavaScript)通过 API 调用后端接口时,后端返回 JSON 格式的数据,前端解析后渲染页面。
例:后端接口返回用户列表:

{"code": 200,"message": "success","data": [{"id": 1, "name": "张三"},{"id": 2, "name": "李四"}]
}

2. 配置文件

相比 XML 或 Properties,JSON 更简洁,常用于存储应用配置(如前端的 package.json、后端的服务配置)。
例:app.json 配置文件:

{"server": {"host": "localhost","port": 8080},"timeout": 3000,"enableLog": true
}

3. 跨服务数据传输

在微服务架构中,服务之间调用(如通过 HTTP、RPC)时,常用 JSON 作为数据载体,确保不同语言开发的服务能无缝通信。

六、如何处理 JSON?(主流语言工具)

几乎所有语言都有成熟的 JSON 处理库,以下是最常用的工具:

1. JavaScript(原生支持)

JavaScript 内置 JSON 对象,可直接解析 / 生成 JSON:

// JSON 字符串转对象
const jsonStr = '{"name": "张三", "age": 25}';
const obj = JSON.parse(jsonStr); // {name: "张三", age: 25}// 对象转 JSON 字符串
const user = { name: "李四", age: 30 };
const jsonStr2 = JSON.stringify(user); // '{"name":"李四","age":30}'

2. Java(Jackson / Fastjson)

  • Jackson:Spring 官方推荐,功能全面,支持复杂对象转换。

    import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper mapper = new ObjectMapper();
    // 对象转 JSON
    String json = mapper.writeValueAsString(user);
    // JSON 转对象
    User user = mapper.readValue(json, User.class);
    
  • Fastjson:阿里巴巴开发,解析速度快,适合简单场景。

    import com.alibaba.fastjson.JSON;// 对象转 JSON
    String json = JSON.toJSONString(user);
    // JSON 转对象
    User user = JSON.parseObject(json, User.class);
    

3. Python(内置 json 模块)

Python 自带 json 库,操作简单:

import json# JSON 字符串转字典
json_str = '{"name": "张三", "age": 25}'
data = json.loads(json_str)  # {'name': '张三', 'age': 25}# 字典转 JSON 字符串
user = {'name': '李四', 'age': 30}
json_str2 = json.dumps(user, ensure_ascii=False)  # 解决中文乱码

七、JSON 最佳实践(避坑指南)

  1. 保持格式规范

    • 键必须用双引号(单引号会报错);
    • 数组 / 对象最后一个元素后不要加逗号;
    • 避免 trailing comma(尾逗号),部分解析器不支持。
  2. 控制嵌套深度
    嵌套过深(如超过 5 层)会降低可读性,增加解析难度,建议扁平化处理。

  3. 处理特殊数据类型

    • 日期:建议用字符串(如 yyyy-MM-dd HH:mm:ss),避免时间戳(可读性差);
    • 二进制数据:不要直接放 JSON 中,建议用 Base64 编码或存储为文件链接。
  4. 避免注释
    JSON 标准不支持注释(// 或 /* */),如需注释可通过额外键(如 "__comment": "说明")实现。

  5. 格式化输出
    开发环境中用格式化工具(如 VS Code 的 Prettier)美化 JSON,生产环境可压缩为一行减少传输量。

八、总结

JSON 之所以成为主流数据交换格式,核心在于它的 “平衡”—— 既足够简单(学习成本低),又能满足绝大多数场景需求(支持复杂结构)。

掌握 JSON 不需要死记硬背,记住它的语法规则,熟悉所在语言的处理工具,再结合实际场景多写多练,很快就能运用自如。无论是前后端开发、接口测试还是配置管理,JSON 都是你绕不开的 “好帮手”。

http://www.dtcms.com/a/305330.html

相关文章:

  • 本地使用postman调试mcp接口
  • 力扣刷题(第一百零二天)
  • Level2可转换债券高频交易五档行情Tick级分钟历史数据深度解析
  • PDF 文档级脚本(Document Level Scripts)
  • SZU大学物理实验报告|光敏电阻
  • 2025年JCR一区新算法-回旋镖气动椭圆优化算法Boomerang Aerodynamic Ellipse(BAE)-附Matlab免费代码
  • Git分支
  • BGP团体属性实验案例
  • PostgreSQL 中 date_trunc 为什么能走索引?【待验证】
  • 【每日一错】Oracle 19c CDB中如何启动一个PDB
  • 2025数字藏品安全保卫战:高防CDN如何成为NFT应用的“隐形护甲”?
  • 字符串函数安全解析成执行函数
  • AE、VAE与GAN简明指南:三大生成模型对比
  • 二维经验模态分解(BEMD)算法详解与MATLAB实现
  • 地图可视化实践录:开篇需求计划
  • SZU大学物理实验报告|基于应变片的电子秤的设计
  • Python爬虫分析B站番剧播放量趋势:从数据采集到可视化分析
  • 纯血鸿蒙 AudioRenderer+AudioCapturer+RingBuffer 实现麦克风采集+发声
  • 选用Java开发商城的优势
  • 功率场效应晶体管MOSFET关键指标
  • 岩石图文分析系统
  • Gartner发布2025年数据安全技术成熟度曲线:29项最新数据安全相关技术发展和应用趋势
  • 【SQL】Windows MySQL 服务查询启动停止自启动(保姆级)
  • 学习日志21 python
  • Sub-GHz射频技术,智能安防系统的“长续航、深覆盖”密码
  • 集成开发环境(IDE)
  • 卸油作业安全设施识别准确率↑32%:陌讯多模态融合算法实战解析
  • Layui表格备注编辑功能代码详解
  • NAT:网络地址转换
  • 开发避坑短篇(8):Java Cookie值非法字符异常分析与解决方案:IllegalArgumentException[32]