自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析JSON的這六種方法,真香!

開發(fā) 前端
架構(gòu)在 Java 開發(fā)中,解析 JSON 是一個非常常見的需求。不管是和前端交互、調(diào)用第三方接口,還是處理配置文件,幾乎都繞不開 JSON。這篇文章總結(jié)了6種主流的 JSON 解析方法,希望對你會有所幫助。

前言

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

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

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

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

功能特點(diǎn)

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

代碼示例

  • 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 省略
}
  • 對象轉(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)缺點(diǎn)

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

缺點(diǎn)

功能全面,支持復(fù)雜場景

配置較多,學(xué)習(xí)成本稍高

性能高,社區(qū)活躍,企業(yè)級項(xiàng)目首選

過于強(qiáng)大,部分功能用不上

豐富的注解支持,便于控制序列化行為

庫體積較大,對于小型項(xiàng)目略顯笨重

2. 使用 Gson:輕量好用

功能特點(diǎn)

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

代碼示例

  • 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()); // 輸出:王五
    }
}
  • 對象轉(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)缺點(diǎn)

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

缺點(diǎn)

輕量級,簡單易用,適合中小型項(xiàng)目

性能稍遜于 Jackson

學(xué)習(xí)曲線平滑,新手容易上手

功能不如 Jackson 豐富

提供良好的擴(kuò)展能力

復(fù)雜對象處理起來較為麻煩

3. 使用 FastJSON:高性能

功能特點(diǎn)

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

代碼示例

  • 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()); // 輸出:小明
    }
}
  • 對象轉(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)缺點(diǎn)

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

缺點(diǎn)

性能極高,解析速度快

曾有歷史安全漏洞的爭議

支持復(fù)雜的動態(tài)字段解析

社區(qū)活躍度稍遜于 Jackson 和 Gson

功能全面,適合大規(guī)模數(shù)據(jù)處理場景

配置選項(xiàng)和 API 比較多,稍顯復(fù)雜

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

功能特點(diǎn)

  • 高效字段提?。和ㄟ^路徑表達(dá)式(類似 XPath)快速提取嵌套字段。
  • 靈活性強(qiáng):支持動態(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}
                    ]
                }
            }
        """;

        // 提取第一個書籍的標(biāo)題
        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)缺點(diǎn)

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

缺點(diǎn)

字段提取簡潔高效

不支持序列化和反序列化

動態(tài)字段處理能力強(qiáng)

依賴 JsonPath 語法

適合快速提取嵌套字段

不適合全量 JSON 轉(zhuǎn)換

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

功能特點(diǎn)

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

代碼示例

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)

輕量級,適合簡單場景

不支持復(fù)雜嵌套對象

使用簡單,學(xué)習(xí)成本低

功能簡單,擴(kuò)展性差

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

功能特點(diǎn)

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

代碼示例

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

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

缺點(diǎn)

靈活性高,適合動態(tài)字段

代碼復(fù)雜度高,不易維護(hù)

不依賴第三方庫

性能和效率低于專業(yè) JSON 庫

總結(jié)

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

方法

適用場景

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

缺點(diǎn)

Jackson

企業(yè)級項(xiàng)目,復(fù)雜序列化和反序列化場景

功能強(qiáng)大,性能優(yōu)異,支持復(fù)雜結(jié)構(gòu)

配置復(fù)雜,學(xué)習(xí)曲線高

Gson

中小型項(xiàng)目,簡單的 JSON 轉(zhuǎn)換場景

輕量級,簡單易用

功能有限,性能略遜

FastJSON

高性能需求,大數(shù)據(jù)量的動態(tài)解析

性能極高,功能豐富

曾有安全漏洞爭議,社區(qū)支持稍遜 Jackson

JsonPath

嵌套結(jié)構(gòu)復(fù)雜、動態(tài)字段提取場景

字段提取語法簡單,靈活性強(qiáng)

不支持序列化和反序列化

org.json

快速解析或構(gòu)造 JSON 場景

輕量級,適合簡單場景

功能單一,擴(kuò)展性差

手動解析

動態(tài) JSON 或字段不固定的場景

自由度高,靈活性強(qiáng)

代碼復(fù)雜,效率低于專業(yè)工具

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

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

責(zé)任編輯:武曉燕 來源: 蘇三說技術(shù)
相關(guān)推薦

2011-02-24 10:56:34

人才

2010-10-08 11:13:22

MySQL修改密碼

2023-09-06 08:00:00

ChatGPT數(shù)據(jù)分析

2021-12-06 06:58:50

List重復(fù)數(shù)據(jù)

2022-06-09 08:46:58

ITCIO職業(yè)

2025-01-03 08:48:20

列表推導(dǎo)式Python編程

2022-06-10 10:25:07

CIOIT領(lǐng)導(dǎo)者職業(yè)生涯

2015-07-09 10:13:05

IT基礎(chǔ)設(shè)施支出數(shù)據(jù)中心

2023-04-26 08:41:16

Git撤消更改

2023-04-03 20:29:00

Linux環(huán)境變量

2023-05-15 18:32:20

2022-02-21 22:47:36

首席信息官IT技術(shù)

2022-05-30 16:42:20

數(shù)據(jù)中心

2022-11-08 11:00:33

2022-11-29 10:33:15

Kubectl命令pod

2024-11-05 08:28:50

2023-12-08 08:53:37

數(shù)據(jù)中心人工智能自動化

2023-11-07 11:11:42

Go性能

2022-03-08 23:04:28

Windows系統(tǒng)數(shù)據(jù)

2023-08-02 10:05:28

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號