欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java解析JSON的六種方案

 更新時間:2025年01月02日 11:09:14   作者:蘇三說技術(shù)  
這篇文章介紹了 6 種 JSON 解析方案,包括 Jackson、Gson、FastJSON、JsonPath、、手動解析,分別闡述了它們的功能特點、代碼示例、高級功能、優(yōu)缺點及適用場景,感興趣的小伙伴跟著小編一起來看看吧

前言

在 Java 開發(fā)中,解析 JSON 是一個非常常見的需求。

不管是和前端交互、調(diào)用第三方接口,還是處理配置文件,幾乎都繞不開 JSON。

這篇文章總結(jié)了6種主流的 JSON 解析方法,希望對你會有所幫助。

1. 使用 Jackson:業(yè)界標配

功能特點

  • 強大的序列化和反序列化:支持將 JSON 字符串轉(zhuǎn)為 Java 對象,也支持將 Java 對象轉(zhuǎn)換為 JSON。
  • 支持復雜結(jié)構(gòu):處理嵌套對象、數(shù)組、泛型等場景非常輕松。
  • 支持注解:如 @JsonIgnore@JsonProperty 等,能精細控制序列化與反序列化的行為。
  • 性能高:Jackson 的性能非常出色,是很多企業(yè)級項目的首選。

代碼示例

1. JSON 轉(zhuǎn)對象(反序列化)

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. 對象轉(zhuǎn) 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")

優(yōu)缺點

優(yōu)點缺點
功能全面,支持復雜場景配置較多,學習成本稍高
性能高,社區(qū)活躍,企業(yè)級項目首選過于強大,部分功能用不上
豐富的注解支持,便于控制序列化行為庫體積較大,對于小型項目略顯笨重

2. 使用 Gson:輕量好用

功能特點

  • 輕量級:Gson 的設(shè)計非常簡潔,代碼量少,適合中小型項目。
  • 支持泛型:可以輕松解析帶泛型的 JSON。
  • 注解控制:支持通過注解控制序列化行為,如 @Expose
  • 易擴展:通過自定義序列化器和反序列化器,可以處理復雜的場景。

代碼示例

1. JSON 轉(zhuǎn)對象

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. 對象轉(zhuǎn) 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;

自定義序列化器/反序列化器

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

優(yōu)缺點

優(yōu)點缺點
輕量級,簡單易用,適合中小型項目性能稍遜于 Jackson
學習曲線平滑,新手容易上手功能不如 Jackson 豐富
提供良好的擴展能力復雜對象處理起來較為麻煩

3. 使用 FastJSON:高性能

功能特點

  • 性能優(yōu)異:FastJSON 的解析速度非常快,適合大數(shù)據(jù)量場景。
  • 支持動態(tài)字段:可以輕松處理動態(tài) JSON 數(shù)據(jù)。
  • 強大的類型支持:支持嵌套對象、泛型、數(shù)組等復雜結(jié)構(gòu)。
  • 注解控制:類似 Jackson 和 Gson,支持注解控制字段的序列化和反序列化。

代碼示例

1. JSON 轉(zhuǎn)對象

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. 對象轉(zhuǎn) JSON

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

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

高級功能

自動駝峰轉(zhuǎn)下劃線

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

動態(tài)字段解析

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

優(yōu)缺點

優(yōu)點缺點
性能極高,解析速度快曾有歷史安全漏洞的爭議
支持復雜的動態(tài)字段解析社區(qū)活躍度稍遜于 Jackson 和 Gson
功能全面,適合大規(guī)模數(shù)據(jù)處理場景配置選項和 API 比較多,稍顯復雜

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

功能特點

  • 高效字段提取:通過路徑表達式(類似 XPath)快速提取嵌套字段。
  • 靈活性強:支持動態(tài)字段和條件過濾。
  • 輕量級:專注于字段提取,功能簡單明確。

代碼示例

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]
    }
}

優(yōu)缺點

優(yōu)點缺點
字段提取簡潔高效不支持序列化和反序列化
動態(tài)字段處理能力強依賴 JsonPath 語法
適合快速提取嵌套字段不適合全量 JSON 轉(zhuǎn)換

5. 使用 org.json:輕量工具類

功能特點

  • 輕量級:核心是一個工具類,適合簡單場景。
  • 構(gòu)造和解析簡單:適合快速創(chuàng)建 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")); // 輸出:張三

        // 構(gòu)造 JSON
        JSONObject newJson = new JSONObject();
        newJson.put("id", 2);
        newJson.put("name", "李四");
        System.out.println(newJson.toString()); // 輸出:{"id":2,"name":"李四"}
    }
}

優(yōu)缺點

優(yōu)點缺點
輕量級,適合簡單場景不支持復雜嵌套對象
使用簡單,學習成本低功能簡單,擴展性差

6. 手動解析 JSON:靈活度最高

功能特點

  • 完全自由:不依賴第三方庫,自己解析 JSON。
  • 動態(tài)處理:適合不規(guī)則字段結(jié)構(gòu)的 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":"動態(tài)字段"}";

        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
        System.out.println(map.get("name")); // 輸出:動態(tài)字段
    }
}

優(yōu)缺點

優(yōu)點缺點
靈活性高,適合動態(tài)字段代碼復雜度高,不易維護
不依賴第三方庫性能和效率低于專業(yè) JSON 庫

總結(jié)

最后給大家對比一下文章中提到的6種方法各自的優(yōu)缺點:

方法適用場景優(yōu)點缺點
Jackson企業(yè)級項目,復雜序列化和反序列化場景功能強大,性能優(yōu)異,支持復雜結(jié)構(gòu)配置復雜,學習曲線高
Gson中小型項目,簡單的 JSON 轉(zhuǎn)換場景輕量級,簡單易用功能有限,性能略遜
FastJSON高性能需求,大數(shù)據(jù)量的動態(tài)解析性能極高,功能豐富曾有安全漏洞爭議,社區(qū)支持稍遜 Jackson
JsonPath嵌套結(jié)構(gòu)復雜、動態(tài)字段提取場景字段提取語法簡單,靈活性強不支持序列化和反序列化
org.json快速解析或構(gòu)造 JSON 場景輕量級,適合簡單場景功能單一,擴展性差
手動解析動態(tài) JSON 或字段不固定的場景自由度高,靈活性強代碼復雜,效率低于專業(yè)工具

工具千千萬,場景最重要!

選對了工具,才能省時省力,少踩坑多摸魚。

以上就是Java解析JSON的六種方案的詳細內(nèi)容,更多關(guān)于Java解析JSON的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot自動配置深入探究實現(xiàn)原理

    SpringBoot自動配置深入探究實現(xiàn)原理

    在springboot的啟動類中可以看到@SpringBootApplication注解,它是SpringBoot的核心注解,也是一個組合注解。其中@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解尤為重要。今天我們就來淺析這三個注解的含義
    2022-08-08
  • Spring Boot 整合 JWT的方法

    Spring Boot 整合 JWT的方法

    這篇文章主要介紹了Spring Boot 整合 JWT的方法,文中實例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 使用Mybatis更新時候只更新變更部分的方法

    使用Mybatis更新時候只更新變更部分的方法

    這篇文章主要介紹了使用Mybatis更新時候只更新變更部分的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Boot 2.X快速整合jpa過程解析

    Spring Boot 2.X快速整合jpa過程解析

    這篇文章主要介紹了Spring Boot 2.X 如何快速整合jpa?,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 全網(wǎng)最新springboot整合mybatis-plus的過程

    全網(wǎng)最新springboot整合mybatis-plus的過程

    在本文中,介紹了 MyBatis-Plus 的核心功能和使用方法,包括如何配置分頁插件、編寫分頁查詢代碼、使用各種 Wrapper 構(gòu)建復雜查詢條件等,通過這些內(nèi)容,相信你已經(jīng)對 MyBatis-Plus 有了更深入的了解,并能夠在實際項目中靈活應(yīng)用這些功能,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • java修飾類的使用方法以及使用技巧(分享)

    java修飾類的使用方法以及使用技巧(分享)

    下面小編就為大家?guī)硪黄猨ava修飾類的使用方法以及使用技巧(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java線程數(shù)究竟設(shè)多少合理

    Java線程數(shù)究竟設(shè)多少合理

    這篇文章主要介紹了Java線程數(shù)究竟設(shè)多少合理,對線程感興趣的同學,可以參考下
    2021-04-04
  • Java關(guān)鍵字instanceof用法及實現(xiàn)策略

    Java關(guān)鍵字instanceof用法及實現(xiàn)策略

    instanceof 運算符是用來在運行時判斷對象是否是指定類及其父類的一個實例。這篇文章主要介紹了Java關(guān)鍵字instanceof用法解析,需要的朋友可以參考下
    2020-08-08
  • IDEA 自動生成 JPA 實體類的圖文教程

    IDEA 自動生成 JPA 實體類的圖文教程

    這篇文章主要介紹了IDEA 自動生成 JPA 實體類的圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java并發(fā)編程this逃逸問題總結(jié)

    Java并發(fā)編程this逃逸問題總結(jié)

    本篇文章給大家詳細分析了Java并發(fā)編程this逃逸的問題分享,對此有需要的朋友參考下。
    2018-02-02

最新評論