最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java解析JSON的六種方案

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

前言

在 Java 開(kāi)發(fā)中,解析 JSON 是一個(gè)非常常見(jiàn)的需求。

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

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

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

功能特點(diǎn)

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

代碼示例

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

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. 對(duì)象轉(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":"李四"}

高級(jí)功能

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

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
功能全面,支持復(fù)雜場(chǎng)景配置較多,學(xué)習(xí)成本稍高
性能高,社區(qū)活躍,企業(yè)級(jí)項(xiàng)目首選過(guò)于強(qiáng)大,部分功能用不上
豐富的注解支持,便于控制序列化行為庫(kù)體積較大,對(duì)于小型項(xiàng)目略顯笨重

2. 使用 Gson:輕量好用

功能特點(diǎn)

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

代碼示例

1. JSON 轉(zhuǎn)對(duì)象

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. 對(duì)象轉(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":"趙六"}

高級(jí)功能

忽略字段@Expose

@Expose
private String name;

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

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

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
輕量級(jí),簡(jiǎn)單易用,適合中小型項(xiàng)目性能稍遜于 Jackson
學(xué)習(xí)曲線平滑,新手容易上手功能不如 Jackson 豐富
提供良好的擴(kuò)展能力復(fù)雜對(duì)象處理起來(lái)較為麻煩

3. 使用 FastJSON:高性能

功能特點(diǎn)

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

代碼示例

1. JSON 轉(zhuǎn)對(duì)象

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

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

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

高級(jí)功能

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

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

動(dòng)態(tài)字段解析

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

優(yōu)缺點(diǎn)

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

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

功能特點(diǎn)

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

代碼示例

import com.jayway.jsonpath.JsonPath;

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

        // 提取第一個(gè)書(shū)籍的標(biāo)題
        String title = JsonPath.read(json, "$.store.book[0].title");
        System.out.println(title); // 輸出:書(shū)1

        // 提取所有書(shū)籍價(jià)格
        List<Integer> prices = JsonPath.read(json, "$.store.book[*].price");
        System.out.println(prices); // 輸出:[10, 20]
    }
}

優(yōu)缺點(diǎn)

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

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

功能特點(diǎn)

  • 輕量級(jí):核心是一個(gè)工具類,適合簡(jiǎn)單場(chǎng)景。
  • 構(gòu)造和解析簡(jiǎn)單:適合快速創(chuàng)建 JSON 或提取字段。
  • 靈活性一般:不支持復(fù)雜對(duì)象映射。

代碼示例

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)缺點(diǎn)

優(yōu)點(diǎn)缺點(diǎn)
輕量級(jí),適合簡(jiǎn)單場(chǎng)景不支持復(fù)雜嵌套對(duì)象
使用簡(jiǎn)單,學(xué)習(xí)成本低功能簡(jiǎn)單,擴(kuò)展性差

6. 手動(dòng)解析 JSON:靈活度最高

功能特點(diǎn)

  • 完全自由:不依賴第三方庫(kù),自己解析 JSON。
  • 動(dòng)態(tài)處理:適合不規(guī)則字段結(jié)構(gòu)的 JSON。
  • 代碼復(fù)雜度高:適合特殊場(chǎng)景。

代碼示例

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":"動(dòng)態(tài)字段"}";

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

優(yōu)缺點(diǎn)

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

總結(jié)

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

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

工具千千萬(wàn),場(chǎng)景最重要!

選對(duì)了工具,才能省時(shí)省力,少踩坑多摸魚(yú)。

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

相關(guān)文章

  • springboot調(diào)用C#封裝的DLL文件中函數(shù)的實(shí)現(xiàn)那

    springboot調(diào)用C#封裝的DLL文件中函數(shù)的實(shí)現(xiàn)那

    本文主要介紹了在Spring Boot中集成C# DLL,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • java 判斷字符串是否包含子串的方法

    java 判斷字符串是否包含子串的方法

    這篇文章主要介紹了java 判斷字符串是否包含子串的方法的相關(guān)資料,這里提供了三種方法幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • 詳解java注解相關(guān)知識(shí)

    詳解java注解相關(guān)知識(shí)

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著java注解的使用展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java SSM框架如何添加寫(xiě)日志功能

    Java SSM框架如何添加寫(xiě)日志功能

    這篇文章主要介紹了Java SSM框架如何添加寫(xiě)日志功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java跳出for循環(huán)的三種常見(jiàn)方法

    java跳出for循環(huán)的三種常見(jiàn)方法

    這篇文章主要給大家介紹了關(guān)于java跳出for循環(huán)的三種常見(jiàn)方法,需要的朋友可以參考下
    2023-07-07
  • Java synchronized鎖升級(jí)jol過(guò)程詳解

    Java synchronized鎖升級(jí)jol過(guò)程詳解

    這篇文章主要介紹了Java synchronized鎖升級(jí)jol過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java面試必備之ArrayList陷阱解析

    Java面試必備之ArrayList陷阱解析

    昨天小楓接到了一個(gè)公司的面試電話,其中一道面試題覺(jué)得有點(diǎn)意思,在這里和大家一起分享下。面試題是ArrayList如何刪除指定元素。乍聽(tīng)很簡(jiǎn)單的問(wèn)題,但是如果沒(méi)有實(shí)際踩過(guò)坑很容易掉進(jìn)面試官的陷阱中,我們一起來(lái)分析下吧
    2022-02-02
  • JAVA如何獲取客戶端IP地址和MAC地址

    JAVA如何獲取客戶端IP地址和MAC地址

    本篇文章主要介紹了JAVA如何獲取客戶端IP地址和MAC地址非常具有實(shí)用價(jià)值,這里整理了詳細(xì)的代碼,需要的朋友可以參考下
    2017-08-08
  • 老生常談Java動(dòng)態(tài)編譯(必看篇)

    老生常談Java動(dòng)態(tài)編譯(必看篇)

    下面小編就為大家?guī)?lái)一篇老生常談Java動(dòng)態(tài)編譯(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 詳細(xì)解讀java同步之synchronized解析

    詳細(xì)解讀java同步之synchronized解析

    synchronized關(guān)鍵字是Java里面最基本的同步手段,下面我們來(lái)一起學(xué)習(xí)一下
    2019-05-05

最新評(píng)論

开化县| 鞍山市| 秦皇岛市| 尖扎县| 平阳县| 闽侯县| 梧州市| 开阳县| 双流县| 资兴市| 随州市| 堆龙德庆县| 叶城县| 凯里市| 文昌市| 盐源县| 武汉市| 延寿县| 峨边| 湖州市| 吕梁市| 白水县| 佛冈县| 阿城市| 南平市| 海兴县| 郸城县| 扎鲁特旗| 西和县| 安阳市| 伊金霍洛旗| 盘锦市| 全州县| 航空| 茌平县| 嘉禾县| 清水县| 句容市| 双桥区| 阿克陶县| 东明县|