写点什么

JSON 解析的这 6 种方案,真香!

  • 2025-01-03
    福建
  • 本文字数:2855 字

    阅读完需:约 9 分钟

前言


在 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 省略}
复制代码


2. 对象转 JSON(序列化)


User user = new User();user.setId(1);user.setName("李四");
ObjectMapper objectMapper = new ObjectMapper();String json = objectMapper.writeValueAsString(user);System.out.println(json); // 输出:{"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

@Exposeprivate String name;
复制代码


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

Gson gson = new GsonBuilder()        .registerTypeAdapter(CustomClass.class, new CustomSerializer())        .create();
复制代码


优缺点



3. 使用 FastJSON:高性能


功能特点


  • 性能优异:FastJSON 的解析速度非常快,适合大数据量场景。

  • 支持动态字段:可以轻松处理动态 JSON 数据。

  • 强大的类型支持:支持嵌套对象、泛型、数组等复杂结构。

  • 注解控制:类似 Jackson 和 Gson,支持注解控制字段的序列化和反序列化。


代码示例


1. JSON 转对象


import com.alibaba.fastjson.JSON;
public 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);
复制代码


优缺点



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] }}
复制代码


优缺点



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 = new ObjectMapper(); Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {}); System.out.println(map.get("name")); // 输出:动态字段 }}
复制代码


优缺点



总结


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



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


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


文章转载自:苏三说技术

原文链接:https://www.cnblogs.com/12lisu/p/18646998

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
JSON解析的这6种方案,真香!_json_不在线第一只蜗牛_InfoQ写作社区