Java解析JSON的六种方案

2025-01-02 15:50
文章标签 java json 解析 方案 六种

本文主要是介绍Java解析JSON的六种方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点...

前言

Java 开发中,解析 JSON 是一个非常常见的需求。

不管是和前端交互、调用第三方接口,还是处理配置文件,几乎都绕不开 JSON。

这篇文章总结了6种主流的 JSON 解析方法,希望对你会有所帮助。

1. 使用 Jackson:业界标配

功能特点

  • 强大的序列化和反序列化:支持将 JSON 字符串转为 Java 对象,也支持将 Java 对象转换为 JSON。
  • 支持复杂结构:处理嵌套对象、数组、泛型等场景非常轻松。
  • 支持注解:如 @JsonIgnore@JsonProperty 等,能精细控制序列化与反序列化的行为。
  • 性能高:Jackson 的性能非常出色,是很多企业级项目的首选。

代码示例

1. JSON 转对象(反序列化)

import com.fasterXML.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) throws Exception {
        String json = "{"id":1,"name":"张三"}";

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);
        System.out.println(user.getName()); // 输出:张三
    }
}

class User {
    private int id;
    private String name;

    // Getters 和 Setters 省略
}China编程

2. 对象转 JSON(序列化)

User user = new User();
user.setId(1);
user.setName("李四");

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
System.out.println(json); javascript// 输出:{"id":1,"name":"李四"}

高级功能

  • 日期格式化@JsonFormat(pattern = "yyyy-MM-dd")
  • 忽略字段@JsonIgnore
  • 重命名字段@JsonProperty("custom_name")

优缺点

优点缺点
功能全面,支持复杂场景配置较多,学习成本稍高
性能高,社区活跃,企业级项目首选过于强大,部分功能用不上
丰富的注解支持,便于控制序列化行为库体积较大,对于小型项目略显笨重

2. 使用 Gson:轻量好用

功能特点

  • 轻量级:Gson 的设计非常简洁,代码量少,适合中小型项目。
  • 支持泛型:可以轻松解析带泛型的 JSON。
  • 注解控制:支持通过注解控制序列化行为,如 @Expose
  • 易扩展:通过自定义序列化器和反序列化器,可以处理复杂的场景。

代码示例

1. JSON 转对象

import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {
        String json = "{"id":1,"name":"王五"}";

        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        System.out.println(user.getName()); // 输出:王五
    }
}

2. 对象转 JSON

User user = new User();
user.setId(2);
user.setName("赵六");

Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json); // 输出:{"id":2,"name":"赵六"}

高级功能

忽略字段@Expose

@Expose
private String name;

自定义序列化器/反序列化器php

Gson gson = new GsonBuilder()
        .registerTypeAdapter(CustomClass.class, new CustomSerializer())
        .create();

优缺点

优点缺点
轻量级,简单易用,适合中小型项目性能稍逊于 Jackson
学习曲线平滑,新手容易上手功能不如 Jackson 丰富
提供良好的扩展能力复杂对象处理起来较为麻烦

3. 使用 FastJSON:高性能

功能特点

  • 性能优异:FastJSON 的解析速度非常快,适合大数据量场景。
  • 支持动态字段:可以轻松处理动态 JSON 数据。
  • 强大的类型支持:支持嵌套对象、泛型、数组等复杂结构。
  • 注解控制:类似 Jackson 和 Gson,支持注解控制字段的序列化和反序列化。

代码示例

1. JSON 转对象

import com.alibaba.fastjson.JSON;

publphpic class FastJsonExample {
    public static void main(String[] args) {
        String json = "{"id":1,"name":"小明"}";

        User user = JSON.parseobject(json, User.class);
        System.out.println(user.getName()); // 输出:小明
    }
}

2. 对象转 JSON

User user = new User();
user.setId(3);
user.setName("小红");

String json = JSON.toJSONString(user);
System.out.println(json); // 输出:{"id":3,"name":"小红"}

高级功能

自动驼峰转下划线

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

动态字段解析

Map<String, Object> map = JSON.parseObject(json, Map.class);

优缺点

优点缺点
性能极高,解析速度快曾有历史安全漏洞的争议
支持复杂的动态字段解析社区活跃度稍逊于 Jackson 和 Gson
功能全面,适合大规模数据处理场景配置选项和 API 比较多,稍显复杂

4. 使用 JsonPath:快速提取嵌套字段

功能特点

  • 高效字段提取:通过路径表达式(类似 XPath)快速提取嵌套字段。
  • 灵活性强:支持动态字段和条件过滤。
  • 轻量级:专注于字段提取,功能简单明确。

代码示例

import com.jayway.jsonpath.JsonPath;

public class JsonPathExample {
    public static void main(String[] args) {
        String json = """
            {
                "store": {
                    "book": [
                        {"title": "书1", "price": 10},
                        {"title": "书2", "price": 20}
                    ]
                }
            }
        """;

        // 提取第一个书籍的标题
        String title = JsonPath.read(json, "$.store.book[0].title");
        System.out.println(title); // 输出:书1

        // 提取所有书籍价格
        List<Integer> prices = JsonPath.read(json, "$.store.book[*].price");
        System.out.println(prices); // 输出:[10, 20]
    }
}

优缺点

优点缺点
字段提取简洁高效不支持序列化和反序列化
动态字段处理能力强依赖 JsonPath 语法
适合快速提取嵌套字段不适合全量 JSON 转换

5. 使用 org.json:轻量工具类

功能特点

  • 轻量级:核心是一个工具类,适合简单场景。
  • 构造和解析简单:适合快速创建 JSON 或提取字段。
  • 灵活性一般:不支持复杂对象映射。

代码示例

import org.json.JSONObject;

public class OrgJsonExample {
    public static void main(String[] args) {
        String json = "{"id":1,"name":"张三"}";

        // 提取字段
        JSONObject jsonObject = new JSONObject(json);
        System.out.println(jsonObject.getString("name")); // 输出:张三

        // 构造 JSON
        JSONObject newJson = new JSONObject();
        newJson.put("id", 2);
        newJson.put("name", "李四");
        System.out.println(newJson.toString()); // 输出:{"id":2,"name":"李四"}
    }
}

优缺点

优点缺点
轻量级,适合简单场景不支持复杂嵌套对象
使用简单,学习成本低功能简单,扩展性差

6. 手动解析 JSON:灵活度最高

功能特点

  • 完全自由:不依赖第三方库,自己解析 JSON。
  • 动态处理:适合不规则字段结构的 JSON。
  • 代码复杂度高:适合特殊场景。

代码示例

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Map;

public class ManualParsing {
    public static void main(String[] args) throws Exception {
        String json = "{"id":1,"name":"动态字段"}";

        ObjectMapper objectMapper = newhttp://www.chinasem.cn ObjectMapper();
        Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
        System.out.println(map.get("name")); // 输出:动态字段
    }
}

优缺点

优点缺点
灵活性高,适合动态字段代码复杂度高,不易维护
不依赖第三方库性能和效率低于专业 JSON 库

总结

最后给大家对比一下文章中提到的6种方法各自的优缺点:

方法适用场景优点缺点
Jackson企业级项目,复杂序列化和反序列化场景功能强大,性能优异,支持复杂结构配置复杂,学习曲线高
Gson中小型项目,简单的 JSON 转换场景轻量级,简单易用功能有限,性能略逊
FastJSON高性能需求,大数据量的动态解析性能极高,功能丰富曾有安全漏洞争议,社区支持稍逊 Jackson
JsonPath嵌套结构复杂、动态字段提取场景字段提取语法简单,灵活性强不支持序列化和反序列化
org.json快速解析或构造 JSON 场景轻量级,适合简单场景功能单一,扩展性差
手动解析动态 JSON 或字段不固定的场景自由度高,灵活性强代码复杂,效率低于专业工具

工具千千万,场景最重要!

选对了工具,才能省时省力,少踩坑多摸鱼。

以上就是Java解析JSON的六种方案的详细内容,更多关于Java解析JSON的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Java解析JSON的六种方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1152894

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析