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

Java中Json字符串和Java對(duì)象的互轉(zhuǎn)

 更新時(shí)間:2025年12月14日 09:11:13   作者:栗箏i  
本文介紹了JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,廣泛應(yīng)用于前后端數(shù)據(jù)傳輸,本文就來(lái)詳細(xì)的介紹一下Java中Json字符串和Java對(duì)象的互轉(zhuǎn),感興趣的可以了解一下

JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。誕生于 2002 年。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。JSON 是目前主流的前后端數(shù)據(jù)傳輸方式。

JSON 采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類似于 C 語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使 JSON 成為理想的數(shù)據(jù)交換語(yǔ)言。幾乎所有的APP、應(yīng)用、網(wǎng)站、程序都離不開 JSON。

常見(jiàn)的 Json 解析器:Gson,F(xiàn)astjson,Json-lib,Jackson

一、Java中Json字符串和Java對(duì)象的互轉(zhuǎn)概述

1、關(guān)于 Json

Json(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。誕生于 2002 年。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。Json 是目前主流的前后端數(shù)據(jù)傳輸方式。

Json 采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類似于 C 語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使 Json 成為理想的數(shù)據(jù)交換語(yǔ)言。幾乎所有的APP、應(yīng)用、網(wǎng)站、程序都離不開 Json。

2、Json 解析器

常見(jiàn)的 Json 解析器:Gson,F(xiàn)astJson,Json-lib,Jackson

  • Gson(又稱Google Gson)是 Google 公司發(fā)布的一個(gè)開放源代碼的 Java 庫(kù)。特點(diǎn)是快速高效,代碼量少、簡(jiǎn)潔;
  • FastJson 是一個(gè)Java語(yǔ)言編寫的高性能的 Json 處理器,由阿里巴巴公司開發(fā)。無(wú)依賴,不需要例外額外的 Jar,能夠直接跑在 Jdk 上;
  • Json-lib 最開始的也是應(yīng)用最廣泛的 Json 解析工具,Json-lib 不好的地方確實(shí)是依賴于很多第三方包;
  • 相比 Json-lib 框架,Jackson 所依賴的 Jar 包較少,簡(jiǎn)單易用并且性能也要相對(duì)高些。而且 Jackson 社區(qū)相對(duì)比較活躍,更新速度也比較快。Jackson 對(duì)于復(fù)雜類型的 Json 轉(zhuǎn)換Bean 會(huì)出現(xiàn)問(wèn)題,一些集合 Map,List 的轉(zhuǎn)換出現(xiàn)問(wèn)題。

序列化性能:FastJson > Jackson > Gson > Jsonlib

反序列化性能:Gson > Jackson > FastJson > Jsonlib

二、使用 Gson 完成 Json 字符串和 Java 對(duì)象的互轉(zhuǎn)

1、Gson 介紹

Google 的 Gson 是目前功能最全的 Json 解析神器,Gson 當(dāng)初是為因應(yīng) Google 公司內(nèi)部需求而由 Google 自行研發(fā),但自從在2008年五月公開發(fā)布第一版后已被許多公司或用戶應(yīng)用。

Gson 的應(yīng)用主要為 toJson 與 fromJson 兩個(gè)轉(zhuǎn)換函數(shù),無(wú)依賴,不需要例外額外的 Jar,能夠直接跑在 Jdk 上。而在使用這種對(duì)象轉(zhuǎn)換之前需先創(chuàng)建好對(duì)象的類型以及其成員才能成功的將Json 字符串成功轉(zhuǎn)換成相對(duì)應(yīng)的對(duì)象。類里面只要有 get 和 set 方法,Gson 完全可以將復(fù)雜類型的 Json 到 Bean 或 Bean 到 Json 的轉(zhuǎn)換,是 Json 解析的神器。

Ps:盡管 Gson 在功能上面無(wú)可挑剔,但是性能上面比 FastJson 有所差距。

2、Gson 引入

Maven 依賴引入:

 <!--gson-->
 <dependency>
     <groupId>com.google.code.gson</groupId>
     <artifactId>gson</artifactId>
     <version>2.10.1</version>
 </dependency>

3、Gson 主要類介紹

Gson 主要類:

  • Gson 類:解析 Json 的最基礎(chǔ)的工具類
  • JsonParser 類:解析器來(lái)解析 Json 到 JsonElements 的解析樹
  • JsonElement 類:一個(gè)類代表的 Json 元素
  • JsonObject 類:Json 對(duì)象類型
  • JsonArray 類:JsonObject 數(shù)組
  • TypeToken 類:用于創(chuàng)建 type,比如泛型 List<?>

4、Gson Demo

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonTestClass {

    public static void main(String[] args) {
        User user = new User();
        user.setId(1);
        user.setName("栗箏i");
        Gson g = new GsonBuilder().create();
        String str = g.toJson(user);
        System.out.println(str);
    }
}

Ps:默認(rèn)是不序列化 null 值對(duì)應(yīng)的 key 的,若是想序列化 null 值對(duì)應(yīng)的 key,只需要將以上創(chuàng)建代碼改成以下代碼就行:

Gson g = new GsonBuilder().serializeNulls().create();

5、對(duì)象與 Json 互轉(zhuǎn)

# bean 轉(zhuǎn)換 Json

Gson gson = new Gson();
// obj 是對(duì)象
String json = gson.toJson(obj);

Ps:當(dāng)我們需要把定義類的成員變量屬性名和返回的 Json 中的格式名稱隔離開,可以采用 @SerializedName 注解標(biāo)記!!

# Json 轉(zhuǎn)換 bean

Gson gson = new Gson();
String json = "{\"id\":\"1\",\"name\":\"栗箏i\"}";
Book book = gson.fromJson(json, Book.class);

# Json 轉(zhuǎn)換復(fù)雜的 bean,比如 List,Set

Gson gson = new Gson();
String json = "[{\"id\":\"1\",\"name\":\"栗箏i\"},{\"id\":\"2\",\"name\":\"栗箏ii\"}]";
// 將 Json 轉(zhuǎn)換成 List
List list = gson.fromJson(json, new TypeToken<LIST>() {}.getType());
// 將 Json 轉(zhuǎn)換成 Set
Set set = gson.fromJson(json, new TypeToken<SET>() {}.getType());

6、直接操作 Json 以及一些 Json 的工具

# 格式化 Json:

String json = "[{\"id\":\"1\",\"name\":\"栗箏i\"},{\"id\":\"2\",\"name\":\"栗箏ii\"}]";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(json);
json = gson.toJson(je);

# 判斷字符串是否是 Json(通過(guò)捕捉的異常來(lái)判斷是否是 Json)

String json = "[{\"id\":\"1\",\"name\":\"栗箏i\"},{\"id\":\"2\",\"name\":\"栗箏ii\"}]";
boolean jsonFlag;
try {
     new JsonParser().parse(str).getAsJsonObject();
     jsonFlag = true;
} catch (Exception e) {
     jsonFlag = false;
}

# 從 Json 串中獲取屬性

String json = "{\"id\":\"1\",\"name\":\"栗箏i\"}";
String propertyName = 'id';
String propertyValue = "";
try {
    JsonParser jsonParser = new JsonParser();
    JsonElement element = jsonParser.parse(json);
    JsonObject jsonObj = element.getAsJsonObject();
    propertyValue = jsonObj.get(propertyName).toString();
} catch (Exception e) {
    propertyValue = null;
}

# 除去 Json 中的某個(gè)屬性

String json = "{\"id\":\"1\",\"name\":\"栗箏i\"}";
String propertyName = 'id';
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
json = jsonObj.toString();

# 向 Json 中添加屬性

String json = "{\"id\":\"1\",\"name\":\"栗箏i\"}";
String propertyName = 'age';
Object propertyValue = "26";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();

# 修改 Json 中的屬性

String json = "{\"id\":\"1\",\"name\":\"栗箏i\"}";
String propertyName = 'name';
Object propertyValue = "栗箏ii";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();

# 判斷 Json 中是否有屬性

String json = "{\"id\":\"1\",\"name\":\"栗箏i\"}";
String propertyName = 'name';
boolean isContains = false ;
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
isContains = jsonObj.has(propertyName);

7、gsonUtil 工具類

import com.dechnic.common.anno.gson.Exclude;
import com.dechnic.common.po.ObjectTypeAdapter;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class GsonUtll {
    private static Gson gson;
    static {
        ExclusionStrategy strategy = new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes f) {
                return f.getAnnotation(Exclude.class) !=null;
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        };
        gson = new GsonBuilder().disableHtmlEscaping().setExclusionStrategies(strategy).registerTypeAdapter(new TypeToken<Map<String,Object>>(){}.getType(),new ObjectTypeAdapter()).serializeNulls().create();
    }
  
    public static Map<String,Object> jsonStr2Map(String jsonStr){
        return gson.fromJson(jsonStr, new TypeToken<Map<String, Object>>() {
        }.getType());
    }
  
    public static List<Map<String,Object>> jsonStr2ListMap(String jsonStr){
        return gson.fromJson(jsonStr, new TypeToken<List<Map<String, Object>>>() {
        }.getType());
    }
  
    public static String toJSON(Object object){
        return gson.toJson(object);
    }
  
    public static <T> List<T> json2ListBean(String result, Class<T> t){
        List list = gson.fromJson(result, new TypeToken<List>() {
        }.getType());
        List list2 = new ArrayList();
        for (Object o : list) {
            list2.add(json2Bean(toJSON(o),t));
        }
        return list2;
    }
  
    public static <T> T json2Bean(String result,Class<T>t){
        return gson.fromJson(result, t);
    }

}

三、使用 FastJson 完成 Json 字符串和 Java 對(duì)象的互轉(zhuǎn)

1、FastJson 介紹

Fastjson 由阿里巴巴公司開發(fā),是一個(gè) Java 語(yǔ)言編寫的高性能的 Json 處理器。無(wú)依賴,不需要例外額外的 Jar,能夠直接跑在 Jdk 上。

FastJson 在復(fù)雜類型的 Bean 轉(zhuǎn)換 Json 上會(huì)出現(xiàn)一些問(wèn)題,可能會(huì)出現(xiàn)引用的類型,導(dǎo)致 Json 轉(zhuǎn)換出錯(cuò),需要制定引用。

FastJson 采用獨(dú)創(chuàng)的算法,將 parse 的速度提升到極致,超過(guò)所有 Json 庫(kù)。

2、FastJson 引入

Maven 依賴引入:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.23</version>
</dependency>

3、null 值對(duì)應(yīng) key 的序列化

FastJson 在轉(zhuǎn)換 Java 對(duì)象為 Json 的時(shí)候,默認(rèn)是不序列化 null 值對(duì)應(yīng)的 key 的,也就是說(shuō)當(dāng)對(duì)象里面的屬性為空的時(shí)候,在轉(zhuǎn)換成 Json 時(shí),不序列化那些為 null 值的屬性

仔細(xì)看 FastJson 轉(zhuǎn)換 Java 對(duì)象為 Json 的方法的入?yún)ⅲ?/p>

public static String toJSONString(Object object, com.alibaba.fastjson2.JSONWriter.Feature... features)

可以看到 features 是一個(gè)數(shù)組 JSONWriter.Feature 則是其序列化屬性:

  • QuoteFieldNames———-輸出 key 時(shí)是否使用雙引號(hào),默認(rèn)為 true
  • WriteMapNullValue——–是否輸出值為 null 的字段,默認(rèn)為 false
  • WriteNullNumberAsZero———-數(shù)值字段如果為 null,輸出為 0,而非 null
  • WriteNullListAsEmpty———-List 字段如果為 null,輸出為[],而非null
  • WriteNullStringAsEmpty———-字符類型字段如果為 null,輸出為”“,而非null
  • WriteNullBooleanAsFalse———-Boolean 字段如果為 null,輸出為 false,而非null

4、FastJson Demo

import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;

public class FastJsonTestClass {

    public static void main(String[] args) {
        User user = new User();
        user.setIdd(1);
        user.setName("栗箏i");
        String str = JSONObject.toJSONString(user, JSONWriter.Feature.WriteMapNullValue);
        System.out.println(str);

    }
}

Ps:當(dāng)我們需要把定義類的成員變量屬性名和返回的 Json 中的格式名稱隔離開,可以采用 @JSONField 注解標(biāo)記??!

5、對(duì)象與 Json 互轉(zhuǎn)

# 對(duì)象轉(zhuǎn) Json

User user = new User();
user.setId(1);
user.setName("栗箏i");
System.out.println(JSON.toJSONString(user, JSONWriter.Feature.UseSingleQuotes));

# Json 轉(zhuǎn)對(duì)象

String json = "{\"id\":1,'name':'張三'}";
User userModel = JSON.parseObject(json, User.class);

# 將 Json 解析為 JSONObject

String json = "{\"id\":1,'name':'張三'}";
JSONObject data = JSON.parseObject(json);
System.out.println(data.get("id"));

# 將 Json 解析為 JSONArray

String text = "...";
JSONArray data = JSON.parseArray(text);

到此這篇關(guān)于Java中Json字符串和Java對(duì)象的互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)Java Json和Java對(duì)象互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談java安全編碼指南之堆污染

    淺談java安全編碼指南之堆污染

    什么是堆污染呢?是指當(dāng)參數(shù)化類型變量引用的對(duì)象不是該參數(shù)化類型的對(duì)象時(shí)而發(fā)生的。我們知道在JDK5中,引入了泛型的概念,在創(chuàng)建集合類的時(shí)候,指定該集合類中應(yīng)該存儲(chǔ)的對(duì)象類型。如果在指定類型的集合中,引用了不同的類型,那么這種情況就叫做堆污染。
    2021-06-06
  • Java8學(xué)習(xí)教程之lambda表達(dá)式語(yǔ)法介紹

    Java8學(xué)習(xí)教程之lambda表達(dá)式語(yǔ)法介紹

    眾所周知lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8學(xué)習(xí)教程之lambda表達(dá)式語(yǔ)法的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Maven模版Bug及解決辦法

    Maven模版Bug及解決辦法

    默認(rèn),會(huì)幫我們創(chuàng)建src/main/resources 按照Maven的規(guī)范,Maven會(huì)有3個(gè)目錄,分別是: src/main/java : java源文件存放位置 src/main/resource : resource資源,如配置文件等 src/test/java : 測(cè)試代碼源文件存放位置
    2016-04-04
  • 使用@RequiredArgsConstructor注解來(lái)取代繁瑣的@Autowrired

    使用@RequiredArgsConstructor注解來(lái)取代繁瑣的@Autowrired

    有了@RequiredArgsConstructor注解,我們就可以減少@Autowired的書寫,本文主要介紹了使用@RequiredArgsConstructor注解來(lái)取代繁瑣的@Autowrired,感興趣的可以了解一下
    2022-04-04
  • 解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題

    解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題

    這篇文章主要介紹了如惡化解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • springboot中非容器類如何獲取配置文件數(shù)據(jù)

    springboot中非容器類如何獲取配置文件數(shù)據(jù)

    這篇文章主要介紹了springboot中非容器類如何獲取配置文件數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mybatis入門教程之新增、更新、刪除功能

    Mybatis入門教程之新增、更新、刪除功能

    這篇文章給大家介紹了Mybatis進(jìn)行基本的增刪改操作,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2017-02-02
  • java配置沙箱支付的實(shí)現(xiàn)示例

    java配置沙箱支付的實(shí)現(xiàn)示例

    箱支付是支付平臺(tái)提供的模擬支付環(huán)境,包含測(cè)試用的 APPID、密鑰、網(wǎng)關(guān)、測(cè)試賬號(hào)等資源,下面就來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2025-08-08
  • java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn)

    java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn)

    本文主要介紹了java使用Stream流對(duì)自定義對(duì)象數(shù)組去重的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Springboot pom項(xiàng)目間接依賴包版本與預(yù)期不符原因解決分析

    Springboot pom項(xiàng)目間接依賴包版本與預(yù)期不符原因解決分析

    這篇文章主要介紹了Springboot pom項(xiàng)目間接依賴包版本與預(yù)期不符原因解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

大姚县| 穆棱市| 瑞丽市| 内乡县| 十堰市| 乌拉特前旗| 陵水| 社会| 无锡市| 黄大仙区| 祁连县| 卓尼县| 保康县| 开平市| 德阳市| 大理市| 苏州市| 雷山县| 微山县| 威信县| 博乐市| 浦城县| 西城区| 洛隆县| 尚义县| 肥乡县| 怀安县| 江安县| 通化市| 漠河县| 施甸县| 囊谦县| 信宜市| 木里| 长治县| 宁化县| 永安市| 辽源市| 谷城县| 满洲里市| 乌海市|