Java JSON全解析6种主流方案深度对比与实战指南

 更新时间:2026年01月09日 14:21:53   作者:Tech_Jia_Hui  
本文介绍了Java中六种主流的JSON解析库:Jackson、Gson、FastJSON、JsonPath、org.json和手动解析,每种库都有其适用的场景和特点,文章还提供了每种库的基础转换和高级功能的实战代码示例,感兴趣的朋友跟随小编一起看看吧

一、Jackson:企业级项目的“标配之选”

Jackson是Java生态中最主流的JSON解析库,Spring Boot默认集成Jackson作为内置解析工具,其强大的功能和优异的性能使其成为企业级项目的首选。

实战代码

1. 基础转换(对象与JSON互转)

import com.fasterxml.jackson.databind.ObjectMapper;
// 定义实体类
class User {
    private Integer id;
    private String name;
    private String email;
    // 必须提供无参构造函数(Jackson反射依赖)
    public User() {}
    // Getter和Setter省略
}
public class JacksonDemo {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonStr = "{\"id\":1,\"name\":\"张三\",\"email\":\"zhangsan@example.com\"}";
        // JSON转对象(反序列化)
        User user = objectMapper.readValue(jsonStr, User.class);
        System.out.println("反序列化结果:" + user.getName());
        // 对象转JSON(序列化)
        User newUser = new User();
        newUser.setId(2);
        newUser.setName("李四");
        newUser.setEmail("lisi@example.com");
        String newJsonStr = objectMapper.writeValueAsString(newUser);
        System.out.println("序列化结果:" + newJsonStr);
    }
}

2. 高级功能(注解控制)

import com.fasterxml.jackson.annotation.*;
import java.util.Date;
class AdvancedUser {
    @JsonProperty("user_id") // JSON字段名映射(解决驼峰与下划线冲突)
    private Integer id;
    @JsonIgnore // 序列化时忽略该字段
    private String password;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 日期格式化
    private Date createTime;
    // Getter和Setter省略
}
// 序列化示例
AdvancedUser user = new AdvancedUser();
user.setId(3);
user.setPassword("123456");
user.setCreateTime(new Date());
String json = new ObjectMapper().writeValueAsString(user);
// 输出:{"user_id":3,"createTime":"2025-08-01 15:30:00"}

适用场景

  • 企业级应用、Spring Boot项目;
  • 复杂对象转换、需要精细控制序列化行为的场景;
  • 高并发、大数据量的JSON处理场景。

二、Gson:轻量级项目的“易用之选”

Gson是Google开源的JSON解析库,以简洁的API设计和极低的学习成本著称,适合中小型项目和快速开发场景。

实战代码

1. 基础转换

import com.google.gson.Gson;
import java.util.List;
public class GsonDemo {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String jsonStr = "{\"id\":1,\"name\":\"王五\",\"age\":25}";
        // JSON转对象
        User user = gson.fromJson(jsonStr, User.class);
        System.out.println("反序列化结果:" + user.getAge());
        // 对象转JSON
        String newJsonStr = gson.toJson(user);
        System.out.println("序列化结果:" + newJsonStr);
        // 泛型对象转换(List为例)
        String listJson = "[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]";
        List<User> userList = gson.fromJson(listJson, new com.google.gson.reflect.TypeToken<List<User>>() {}.getType());
        System.out.println("List反序列化大小:" + userList.size());
    }
}

2. 高级功能(注解与自定义适配器)

import com.google.gson.annotations.Expose;
import com.google.gson.GsonBuilder;
class GsonUser {
    @Expose(serialize = true, deserialize = true) // 序列化和反序列化都生效
    private Integer id;
    @Expose(serialize = false) // 仅反序列化,不序列化
    private String tempField;
    // Getter和Setter省略
}
// 自定义适配器(处理日期格式)
class DateAdapter implements com.google.gson.TypeAdapter<Date> {
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    @Override
    public void write(com.google.gson.stream.JsonWriter out, Date value) throws IOException {
        out.value(sdf.format(value));
    }
    @Override
    public Date read(com.google.gson.stream.JsonReader in) throws IOException {
        try {
            return sdf.parse(in.nextString());
        } catch (ParseException e) {
            return null;
        }
    }
}
// 使用示例
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateAdapter()) // 注册适配器
        .excludeFieldsWithoutExposeAnnotation() // 只序列化带@Expose注解的字段
        .create();

适用场景

  • 中小型项目、快速开发需求;
  • 简单JSON转换场景(无复杂字段控制需求);
  • 对库体积敏感的场景(如移动端Java应用)。

三、FastJSON:高性能场景的“极速之选”

FastJSON是阿里巴巴开源的JSON解析库,以极致的解析速度闻名,适合大数据量、高并发场景的JSON处理。

实战代码

1. 基础转换

import com.alibaba.fastjson.JSON;
import java.util.List;
public class FastJsonDemo {
    public static void main(String[] args) {
        String jsonStr = "{\"id\":1,\"name\":\"赵六\",\"address\":\"北京\"}";
        // JSON转对象
        User user = JSON.parseObject(jsonStr, User.class);
        System.out.println("反序列化结果:" + user.getAddress());
        // 对象转JSON
        String newJsonStr = JSON.toJSONString(user);
        System.out.println("序列化结果:" + newJsonStr);
        // JSON转List
        String listJson = "[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]";
        List<User> userList = JSON.parseArray(listJson, User.class);
        System.out.println("List反序列化大小:" + userList.size());
    }
}

2. 高级功能(动态字段与格式化)

import com.alibaba.fastjson.serializer.SerializerFeature;
// 动态字段解析(JSON转Map)
String dynamicJson = "{\"id\":1,\"name\":\"孙七\",\"score\":90.5}";
Map<String, Object> map = JSON.parseObject(dynamicJson, Map.class);
System.out.println("动态字段score:" + map.get("score"));
// 格式化输出(美化JSON)
User user = new User();
user.setId(2);
user.setName("周八");
String prettyJson = JSON.toJSONString(user, SerializerFeature.PrettyFormat);
System.out.println("美化后的JSON:" + prettyJson);
// 日期格式化
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
String dateJson = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);
System.out.println("日期格式化结果:" + dateJson);

适用场景

  • 高并发、大数据量的JSON处理(如日志解析、批量数据同步);
  • 动态字段较多的场景(如第三方接口返回不固定字段);
  • 对解析速度有极致要求的场景。

四、JsonPath:嵌套JSON的“字段提取神器”

JsonPath是一款专注于JSON字段提取的工具,通过类似XPath的路径表达式,可快速从复杂嵌套JSON中提取目标字段,无需完整反序列化为Java对象。

实战代码

import com.jayway.jsonpath.JsonPath;
import java.util.List;
public class JsonPathDemo {
    public static void main(String[] args) {
        // 复杂嵌套JSON
        String complexJson = """
            {
                "store": {
                    "book": [
                        {"title": "Java编程思想", "price": 108, "category": "编程"},
                        {"title": "深入理解Java虚拟机", "price": 89, "category": "编程"},
                        {"title": "三体", "price": 39, "category": "科幻"}
                    ],
                    "address": {
                        "city": "北京",
                        "street": "科技园路"
                    }
                }
            }
        """;
        // 1. 提取单个字段(商店城市)
        String city = JsonPath.read(complexJson, "$.store.address.city");
        System.out.println("商店城市:" + city);
        // 2. 提取数组所有元素的某个字段(所有书籍标题)
        List<String> bookTitles = JsonPath.read(complexJson, "$.store.book[*].title");
        System.out.println("所有书籍标题:" + bookTitles);
        // 3. 条件过滤(价格大于80的书籍)
        List<Object> expensiveBooks = JsonPath.read(complexJson, "$.store.book[?(@.price > 80)]");
        System.out.println("价格大于80的书籍:" + expensiveBooks);
        // 4. 提取数组指定索引元素(第一本书的价格)
        Double firstBookPrice = JsonPath.read(complexJson, "$.store.book[0].price");
        System.out.println("第一本书价格:" + firstBookPrice);
    }
}

适用场景

  • 仅需提取JSON中部分字段(无需完整转换);
  • 复杂嵌套JSON的字段查询(如第三方接口返回的深层嵌套数据);
  • 动态筛选JSON数组中的元素。

五、org.json:简单场景的“轻量工具”

org.json是Java原生风格的JSON工具类,无需复杂依赖,仅提供基础的JSON构造和字段提取功能,适合简单场景的快速开发。

实战代码

import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonDemo {
    public static void main(String[] args) {
        // 1. 解析JSON字符串
        String jsonStr = "{\"id\":1,\"name\":\"吴九\",\"hobbies\":[\"篮球\",\"读书\"]}";
        JSONObject jsonObject = new JSONObject(jsonStr);
        // 提取字段
        String name = jsonObject.getString("name");
        JSONArray hobbies = jsonObject.getJSONArray("hobbies");
        System.out.println("姓名:" + name + ",爱好:" + hobbies.get(0));
        // 2. 构造JSON
        JSONObject newJsonObject = new JSONObject();
        newJsonObject.put("id", 2);
        newJsonObject.put("name", "郑十");
        newJsonObject.put("age", 30);
        // 构造JSON数组
        JSONArray skills = new JSONArray();
        skills.put("Java");
        skills.put("MySQL");
        newJsonObject.put("skills", skills);
        System.out.println("构造的JSON:" + newJsonObject.toString());
    }
}

适用场景

  • 简单JSON的构造或字段提取(如配置文件读取);
  • 无需依赖第三方库的场景(如小型工具类、嵌入式应用);
  • 快速原型开发,无需复杂JSON处理功能。

六、手动解析:特殊场景的“灵活方案”

手动解析是指不依赖第三方库,通过字符串处理、正则表达式等方式解析JSON,灵活性最高,但开发成本和维护成本也最高。

实战代码(简单JSON手动解析)

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ManualParseDemo {
    public static void main(String[] args) {
        String jsonStr = "{\"id\":1,\"name\":\"手动解析\",\"value\":\"test\"}";
        Map<String, String> resultMap = parseJson(jsonStr);
        System.out.println("id:" + resultMap.get("id"));
        System.out.println("name:" + resultMap.get("name"));
    }
    // 简单JSON手动解析(仅支持字符串和数字字段)
    private static Map<String, String> parseJson(String json) {
        Map<String, String> map = new HashMap<>();
        // 正则表达式匹配 "key":"value" 或 "key":number
        Pattern pattern = Pattern.compile("\"(.*?)\":\"?(.*?)\"?(,|})");
        Matcher matcher = pattern.matcher(json.replaceAll("\\s+", "")); // 去除空格
        while (matcher.find()) {
            String key = matcher.group(1);
            String value = matcher.group(2);
            map.put(key, value);
        }
        return map;
    }
}

适用场景

  • 非标准JSON数据(如字段无引号、格式不规则);
  • 对依赖库有严格限制的场景;
  • 简单且固定格式的JSON,无需引入第三方库。

到此这篇关于Java JSON解析全攻略:6种主流方案深度对比与实战指南的文章就介绍到这了,更多相关Java JSON解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot使用EMQX(MQTT协议)的实现

    springboot使用EMQX(MQTT协议)的实现

    最近由于iot越来越火, 物联网的需求越来越多, 那么理所当然的使用mqtt的场景也就越来越多,本文主要介绍了springboot使用EMQX(MQTT协议)的实现,感兴趣的可以了解一下
    2023-10-10
  • 详解Java的按位操作符

    详解Java的按位操作符

    Java的位操作符用来操作整数基本数据类型中的单个“比特”(bit),即代进制位。下面通过本文给大家分享Java的按位操作符,感兴趣的朋友一起看看吧
    2017-09-09
  • Java设计模式之解释器模式(Interpreter模式)介绍

    Java设计模式之解释器模式(Interpreter模式)介绍

    这篇文章主要介绍了Java设计模式之解释器模式(Interpreter模式)介绍,Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子,需要的朋友可以参考下
    2015-03-03
  • Java获取当前时间并转化为yyyy-MM-dd HH:mm:ss格式的多种方式

    Java获取当前时间并转化为yyyy-MM-dd HH:mm:ss格式的多种方式

    这篇文章主要介绍了Java获取当前时间并转化为yyyy-MM-dd HH:mm:ss格式的多种方式,每种方式结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • Java中如何获取mysql连接的3种方法总结

    Java中如何获取mysql连接的3种方法总结

    最近工作中需要用到mysql连接,发现实现的方法不止一个,所以就来总结下,下面这篇文章主要给大家介绍了关于Java中如何获取mysql连接的3种方法,需要的朋友可以参考借鉴,感兴趣的朋友们下面随着小编来一起学习学习吧。
    2017-08-08
  • Spring Security动态权限的实现方法详解

    Spring Security动态权限的实现方法详解

    这篇文章主要和小伙伴们简单介绍下 Spring Security 中的动态权限方案,以便于小伙伴们更好的理解 TienChin 项目中的权限方案,感兴趣的可以了解一下
    2022-06-06
  • 亲手带你解决Debug Fastjson的安全漏洞

    亲手带你解决Debug Fastjson的安全漏洞

    这篇文章主要介绍了亲手带你解决Debug Fastjson的安全漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Springboot实现添加本地模块依赖方式

    Springboot实现添加本地模块依赖方式

    这篇文章主要介绍了Springboot实现添加本地模块依赖方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java开发环境配置JDK超详细整理(适合新手入门)

    Java开发环境配置JDK超详细整理(适合新手入门)

    这篇文章主要给大家介绍了关于Java开发环境配置JDK超详细整理的相关资料,非常适合新手入门,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序,需要的朋友可以参考下
    2023-11-11
  • 基于RabbitMQ几种Exchange 模式详解

    基于RabbitMQ几种Exchange 模式详解

    下面小编就为大家带来一篇基于RabbitMQ几种Exchange 模式详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论