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

Java JSON全解析6種主流方案深度對(duì)比與實(shí)戰(zhàn)指南

 更新時(shí)間:2026年01月09日 14:21:53   作者:Tech_Jia_Hui  
本文介紹了Java中六種主流的JSON解析庫(kù):Jackson、Gson、FastJSON、JsonPath、org.json和手動(dòng)解析,每種庫(kù)都有其適用的場(chǎng)景和特點(diǎn),文章還提供了每種庫(kù)的基礎(chǔ)轉(zhuǎn)換和高級(jí)功能的實(shí)戰(zhàn)代碼示例,感興趣的朋友跟隨小編一起看看吧

一、Jackson:企業(yè)級(jí)項(xiàng)目的“標(biāo)配之選”

Jackson是Java生態(tài)中最主流的JSON解析庫(kù),Spring Boot默認(rèn)集成Jackson作為內(nèi)置解析工具,其強(qiáng)大的功能和優(yōu)異的性能使其成為企業(yè)級(jí)項(xiàng)目的首選。

實(shí)戰(zhàn)代碼

1. 基礎(chǔ)轉(zhuǎn)換(對(duì)象與JSON互轉(zhuǎn))

import com.fasterxml.jackson.databind.ObjectMapper;
// 定義實(shí)體類
class User {
    private Integer id;
    private String name;
    private String email;
    // 必須提供無(wú)參構(gòu)造函數(shù)(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轉(zhuǎn)對(duì)象(反序列化)
        User user = objectMapper.readValue(jsonStr, User.class);
        System.out.println("反序列化結(jié)果:" + user.getName());
        // 對(duì)象轉(zhuǎn)JSON(序列化)
        User newUser = new User();
        newUser.setId(2);
        newUser.setName("李四");
        newUser.setEmail("lisi@example.com");
        String newJsonStr = objectMapper.writeValueAsString(newUser);
        System.out.println("序列化結(jié)果:" + newJsonStr);
    }
}

2. 高級(jí)功能(注解控制)

import com.fasterxml.jackson.annotation.*;
import java.util.Date;
class AdvancedUser {
    @JsonProperty("user_id") // JSON字段名映射(解決駝峰與下劃線沖突)
    private Integer id;
    @JsonIgnore // 序列化時(shí)忽略該字段
    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"}

適用場(chǎng)景

  • 企業(yè)級(jí)應(yīng)用、Spring Boot項(xiàng)目;
  • 復(fù)雜對(duì)象轉(zhuǎn)換、需要精細(xì)控制序列化行為的場(chǎng)景;
  • 高并發(fā)、大數(shù)據(jù)量的JSON處理場(chǎng)景。

二、Gson:輕量級(jí)項(xiàng)目的“易用之選”

Gson是Google開(kāi)源的JSON解析庫(kù),以簡(jiǎn)潔的API設(shè)計(jì)和極低的學(xué)習(xí)成本著稱,適合中小型項(xiàng)目和快速開(kāi)發(fā)場(chǎng)景。

實(shí)戰(zhàn)代碼

1. 基礎(chǔ)轉(zhuǎn)換

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轉(zhuǎn)對(duì)象
        User user = gson.fromJson(jsonStr, User.class);
        System.out.println("反序列化結(jié)果:" + user.getAge());
        // 對(duì)象轉(zhuǎn)JSON
        String newJsonStr = gson.toJson(user);
        System.out.println("序列化結(jié)果:" + newJsonStr);
        // 泛型對(duì)象轉(zhuǎn)換(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. 高級(jí)功能(注解與自定義適配器)

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()) // 注冊(cè)適配器
        .excludeFieldsWithoutExposeAnnotation() // 只序列化帶@Expose注解的字段
        .create();

適用場(chǎng)景

  • 中小型項(xiàng)目、快速開(kāi)發(fā)需求;
  • 簡(jiǎn)單JSON轉(zhuǎn)換場(chǎng)景(無(wú)復(fù)雜字段控制需求);
  • 對(duì)庫(kù)體積敏感的場(chǎng)景(如移動(dòng)端Java應(yīng)用)。

三、FastJSON:高性能場(chǎng)景的“極速之選”

FastJSON是阿里巴巴開(kāi)源的JSON解析庫(kù),以極致的解析速度聞名,適合大數(shù)據(jù)量、高并發(fā)場(chǎng)景的JSON處理。

實(shí)戰(zhàn)代碼

1. 基礎(chǔ)轉(zhuǎn)換

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轉(zhuǎn)對(duì)象
        User user = JSON.parseObject(jsonStr, User.class);
        System.out.println("反序列化結(jié)果:" + user.getAddress());
        // 對(duì)象轉(zhuǎn)JSON
        String newJsonStr = JSON.toJSONString(user);
        System.out.println("序列化結(jié)果:" + newJsonStr);
        // JSON轉(zhuǎn)List
        String listJson = "[{\"id\":1,\"name\":\"張三\"},{\"id\":2,\"name\":\"李四\"}]";
        List<User> userList = JSON.parseArray(listJson, User.class);
        System.out.println("List反序列化大?。? + userList.size());
    }
}

2. 高級(jí)功能(動(dòng)態(tài)字段與格式化)

import com.alibaba.fastjson.serializer.SerializerFeature;
// 動(dòng)態(tài)字段解析(JSON轉(zhuǎn)Map)
String dynamicJson = "{\"id\":1,\"name\":\"孫七\(yùn)",\"score\":90.5}";
Map<String, Object> map = JSON.parseObject(dynamicJson, Map.class);
System.out.println("動(dòng)態(tài)字段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("日期格式化結(jié)果:" + dateJson);

適用場(chǎng)景

  • 高并發(fā)、大數(shù)據(jù)量的JSON處理(如日志解析、批量數(shù)據(jù)同步);
  • 動(dòng)態(tài)字段較多的場(chǎng)景(如第三方接口返回不固定字段);
  • 對(duì)解析速度有極致要求的場(chǎng)景。

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

JsonPath是一款專注于JSON字段提取的工具,通過(guò)類似XPath的路徑表達(dá)式,可快速?gòu)膹?fù)雜嵌套JSON中提取目標(biāo)字段,無(wú)需完整反序列化為Java對(duì)象。

實(shí)戰(zhàn)代碼

import com.jayway.jsonpath.JsonPath;
import java.util.List;
public class JsonPathDemo {
    public static void main(String[] args) {
        // 復(fù)雜嵌套JSON
        String complexJson = """
            {
                "store": {
                    "book": [
                        {"title": "Java編程思想", "price": 108, "category": "編程"},
                        {"title": "深入理解Java虛擬機(jī)", "price": 89, "category": "編程"},
                        {"title": "三體", "price": 39, "category": "科幻"}
                    ],
                    "address": {
                        "city": "北京",
                        "street": "科技園路"
                    }
                }
            }
        """;
        // 1. 提取單個(gè)字段(商店城市)
        String city = JsonPath.read(complexJson, "$.store.address.city");
        System.out.println("商店城市:" + city);
        // 2. 提取數(shù)組所有元素的某個(gè)字段(所有書籍標(biāo)題)
        List<String> bookTitles = JsonPath.read(complexJson, "$.store.book[*].title");
        System.out.println("所有書籍標(biāo)題:" + bookTitles);
        // 3. 條件過(guò)濾(價(jià)格大于80的書籍)
        List<Object> expensiveBooks = JsonPath.read(complexJson, "$.store.book[?(@.price > 80)]");
        System.out.println("價(jià)格大于80的書籍:" + expensiveBooks);
        // 4. 提取數(shù)組指定索引元素(第一本書的價(jià)格)
        Double firstBookPrice = JsonPath.read(complexJson, "$.store.book[0].price");
        System.out.println("第一本書價(jià)格:" + firstBookPrice);
    }
}

適用場(chǎng)景

  • 僅需提取JSON中部分字段(無(wú)需完整轉(zhuǎn)換);
  • 復(fù)雜嵌套JSON的字段查詢(如第三方接口返回的深層嵌套數(shù)據(jù));
  • 動(dòng)態(tài)篩選JSON數(shù)組中的元素。

五、org.json:簡(jiǎn)單場(chǎng)景的“輕量工具”

org.json是Java原生風(fēng)格的JSON工具類,無(wú)需復(fù)雜依賴,僅提供基礎(chǔ)的JSON構(gòu)造和字段提取功能,適合簡(jiǎn)單場(chǎng)景的快速開(kāi)發(fā)。

實(shí)戰(zhàn)代碼

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 + ",愛(ài)好:" + hobbies.get(0));
        // 2. 構(gòu)造JSON
        JSONObject newJsonObject = new JSONObject();
        newJsonObject.put("id", 2);
        newJsonObject.put("name", "鄭十");
        newJsonObject.put("age", 30);
        // 構(gòu)造JSON數(shù)組
        JSONArray skills = new JSONArray();
        skills.put("Java");
        skills.put("MySQL");
        newJsonObject.put("skills", skills);
        System.out.println("構(gòu)造的JSON:" + newJsonObject.toString());
    }
}

適用場(chǎng)景

  • 簡(jiǎn)單JSON的構(gòu)造或字段提?。ㄈ缗渲梦募x?。?;
  • 無(wú)需依賴第三方庫(kù)的場(chǎng)景(如小型工具類、嵌入式應(yīng)用);
  • 快速原型開(kāi)發(fā),無(wú)需復(fù)雜JSON處理功能。

六、手動(dòng)解析:特殊場(chǎng)景的“靈活方案”

手動(dòng)解析是指不依賴第三方庫(kù),通過(guò)字符串處理、正則表達(dá)式等方式解析JSON,靈活性最高,但開(kāi)發(fā)成本和維護(hù)成本也最高。

實(shí)戰(zhàn)代碼(簡(jiǎn)單JSON手動(dòng)解析)

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\":\"手動(dòng)解析\",\"value\":\"test\"}";
        Map<String, String> resultMap = parseJson(jsonStr);
        System.out.println("id:" + resultMap.get("id"));
        System.out.println("name:" + resultMap.get("name"));
    }
    // 簡(jiǎn)單JSON手動(dòng)解析(僅支持字符串和數(shù)字字段)
    private static Map<String, String> parseJson(String json) {
        Map<String, String> map = new HashMap<>();
        // 正則表達(dá)式匹配 "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;
    }
}

適用場(chǎng)景

  • 非標(biāo)準(zhǔn)JSON數(shù)據(jù)(如字段無(wú)引號(hào)、格式不規(guī)則);
  • 對(duì)依賴庫(kù)有嚴(yán)格限制的場(chǎng)景;
  • 簡(jiǎn)單且固定格式的JSON,無(wú)需引入第三方庫(kù)。

到此這篇關(guān)于Java JSON解析全攻略:6種主流方案深度對(duì)比與實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java JSON解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

都昌县| 永州市| 临沂市| 织金县| 东山县| 道孚县| 汝州市| 阜康市| 兰溪市| 浦县| 唐海县| 西昌市| 库车县| 将乐县| 龙门县| 易门县| 平山县| 乌兰浩特市| 木兰县| 奉新县| 上思县| 嘉荫县| 海伦市| 志丹县| 苏尼特右旗| 田阳县| 云安县| 眉山市| 崇左市| 四川省| 招远市| 德惠市| 柏乡县| 岗巴县| 永登县| 贵定县| 武威市| 茂名市| 穆棱市| 叙永县| 门源|