跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java JSON概述
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Java JSON概述}} '''Java JSON处理'''是Java编程中用于解析、生成和操作[[JSON]](JavaScript Object Notation)数据的核心技术。JSON作为一种轻量级数据交换格式,在现代Web开发、API通信和配置管理中广泛应用。本文将全面介绍Java中处理JSON的基本概念、常用库及实际应用。 == 什么是JSON? == JSON(JavaScript Object Notation)是一种基于文本的开放标准数据格式,采用人类可读的键值对结构。其语法规则如下: * 数据以键值对形式存储,格式为<code>"key": value</code> * 键必须是字符串(双引号包裹) * 值可以是字符串、数字、布尔值、数组、对象或null * 使用大括号<code>{}</code>表示对象,方括号<code>[]</code>表示数组 示例JSON对象: <syntaxhighlight lang="json"> { "name": "Alice", "age": 30, "isStudent": false, "courses": ["Java", "Database"], "address": { "city": "New York", "zip": "10001" } } </syntaxhighlight> == Java中的JSON处理库 == Java标准库未内置JSON支持,但主流第三方库包括: {| class="wikitable" |- ! 库名称 !! 特点 !! Maven坐标 |- | [[org.json]] || 轻量级,API简单 || <code>org.json:json:20231013</code> |- | [[Gson]] || Google开发,支持对象映射 || <code>com.google.code.gson:gson:2.10.1</code> |- | [[Jackson]] || 高性能,功能全面 || <code>com.fasterxml.jackson.core:jackson-databind:2.15.2</code> |- | [[JSON-B]] || Java EE标准API || <code>javax.json:javax.json-api:1.1.4</code> |} === 基础操作示例 === 以下展示使用不同库解析和生成JSON的基本操作: ==== 使用org.json ==== <syntaxhighlight lang="java"> // 解析JSON String jsonStr = "{\"name\":\"Bob\"}"; JSONObject obj = new JSONObject(jsonStr); String name = obj.getString("name"); // 输出: Bob // 生成JSON JSONObject newObj = new JSONObject(); newObj.put("id", 123); System.out.println(newObj.toString()); // 输出: {"id":123} </syntaxhighlight> ==== 使用Gson ==== <syntaxhighlight lang="java"> // 对象转JSON Gson gson = new Gson(); Person person = new Person("Charlie", 25); String json = gson.toJson(person); // 输出: {"name":"Charlie","age":25} // JSON转对象 Person newPerson = gson.fromJson(json, Person.class); </syntaxhighlight> == 核心概念 == === JSON与Java类型映射 === JSON数据类型与Java类型的对应关系: <mermaid> flowchart LR JSON[JSON类型] --> Java[Java类型] JSON -->|字符串| Java["String"] JSON -->|数字| Java["int/long/double"] JSON -->|布尔值| Java["boolean"] JSON -->|数组| Java["List/Array"] JSON -->|对象| Java["Map/POJO"] JSON -->|null| Java["null"] </mermaid> === 树模型 vs 数据绑定 === Java处理JSON的两种主要方式: {| class="wikitable" |- ! 方式 !! 描述 !! 适用场景 |- | '''树模型''' || 将JSON解析为内存中的树状结构(如JsonNode/Document) || 动态处理未知结构JSON |- | '''数据绑定''' || 直接将JSON与Java对象相互转换 || 已知固定结构的JSON处理 |} ==== 树模型示例(Jackson) ==== <syntaxhighlight lang="java"> ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree("{\"k1\":\"v1\"}"); String value = root.get("k1").asText(); // 获取v1 </syntaxhighlight> ==== 数据绑定示例 ==== <syntaxhighlight lang="java"> // 定义Java类 class User { public String name; public int age; } // JSON转对象 ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue("{\"name\":\"Dave\",\"age\":40}", User.class); </syntaxhighlight> == 高级特性 == === 流式API处理 === 对于大体积JSON文件,可使用流式API(如Jackson的JsonParser)减少内存占用: <syntaxhighlight lang="java"> JsonFactory factory = new JsonFactory(); try (JsonParser parser = factory.createParser(new File("large.json"))) { while (parser.nextToken() != null) { // 逐令牌处理 } } </syntaxhighlight> === 自定义序列化 === 通过实现自定义序列化器控制转换过程(Gson示例): <syntaxhighlight lang="java"> class DateAdapter implements JsonSerializer<Date> { public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.getTime()); // 转换为时间戳 } } Gson gson = new GsonBuilder() .registerTypeAdapter(Date.class, new DateAdapter()) .create(); </syntaxhighlight> == 实际应用案例 == === REST API通信 === 典型的使用JSON进行HTTP请求的流程: <mermaid> sequenceDiagram Client->>+Server: POST /users (JSON Body) Server->>+Database: 保存JSON数据 Database-->>-Server: 操作结果 Server-->>-Client: JSON响应 </mermaid> 代码实现(使用Jackson): <syntaxhighlight lang="java"> // 发送请求 ObjectMapper mapper = new ObjectMapper(); User user = new User("Eve", 28); String json = mapper.writeValueAsString(user); HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.example.com/users")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); // 处理响应 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); User createdUser = mapper.readValue(response.body(), User.class); </syntaxhighlight> === 配置文件处理 === 将JSON配置文件读取为Java对象: <syntaxhighlight lang="java"> // config.json // { // "appName": "MyApp", // "maxConnections": 100 // } Config config = new ObjectMapper() .readValue(new File("config.json"), Config.class); </syntaxhighlight> == 性能考虑 == 处理JSON时需注意: * 大文件处理:使用流式API避免内存溢出 * 线程安全:ObjectMapper等实例通常线程安全 * 缓存:重复使用的解析器/构建器应复用 性能对比公式(操作耗时模型): <math> T_{total} = N \times (T_{parse} + T_{process}) </math> 其中: * <math>N</math> = 操作次数 * <math>T_{parse}</math> = 单次解析耗时 * <math>T_{process}</math> = 单次处理耗时 == 最佳实践 == 1. 始终验证输入JSON的合法性 2. 处理数值时注意类型边界 3. 使用<code>try-with-resources</code>管理资源 4. 考虑使用JSON Schema验证复杂结构 5. 在微服务中统一序列化配置 == 常见问题 == {{Q&A |问题 = 如何处理日期格式? |答案 = 推荐使用ISO-8601字符串格式(如"2023-01-15T10:00:00Z"),并通过库的日期适配器配置转换规则。 }} {{Q&A |问题 = 超大JSON文件如何处理? |答案 = 使用流式解析(如Jackson的JsonParser)或分块处理,避免一次性加载到内存。 }} == 总结 == Java JSON处理是现代Java开发的核心技能之一。通过选择合适的库(如Jackson/Gson)并理解树模型与数据绑定的区别,开发者可以高效地在Java应用中实现JSON数据的序列化与反序列化。实际开发中应根据具体场景考虑性能、内存使用和代码可维护性的平衡。 [[Category:编程语言]] [[Category:Java]] [[Category:Java JSON处理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Q&A
(
编辑
)