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

Java中Json字符串和Java對象的互轉

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

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

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

常見的 Json 解析器:Gson,Fastjson,Json-lib,Jackson

一、Java中Json字符串和Java對象的互轉概述

1、關于 Json

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

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

2、Json 解析器

常見的 Json 解析器:Gson,FastJson,Json-lib,Jackson

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

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

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

二、使用 Gson 完成 Json 字符串和 Java 對象的互轉

1、Gson 介紹

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

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

Ps:盡管 Gson 在功能上面無可挑剔,但是性能上面比 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 的最基礎的工具類
  • JsonParser 類:解析器來解析 Json 到 JsonElements 的解析樹
  • JsonElement 類:一個類代表的 Json 元素
  • JsonObject 類:Json 對象類型
  • JsonArray 類:JsonObject 數組
  • 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:默認是不序列化 null 值對應的 key 的,若是想序列化 null 值對應的 key,只需要將以上創(chuàng)建代碼改成以下代碼就行:

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

5、對象與 Json 互轉

# bean 轉換 Json

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

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

# Json 轉換 bean

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

# Json 轉換復雜的 bean,比如 List,Set

Gson gson = new Gson();
String json = "[{\"id\":\"1\",\"name\":\"栗箏i\"},{\"id\":\"2\",\"name\":\"栗箏ii\"}]";
// 將 Json 轉換成 List
List list = gson.fromJson(json, new TypeToken<LIST>() {}.getType());
// 將 Json 轉換成 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(通過捕捉的異常來判斷是否是 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 中的某個屬性

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 對象的互轉

1、FastJson 介紹

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

FastJson 在復雜類型的 Bean 轉換 Json 上會出現一些問題,可能會出現引用的類型,導致 Json 轉換出錯,需要制定引用。

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

2、FastJson 引入

Maven 依賴引入:

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

3、null 值對應 key 的序列化

FastJson 在轉換 Java 對象為 Json 的時候,默認是不序列化 null 值對應的 key 的,也就是說當對象里面的屬性為空的時候,在轉換成 Json 時,不序列化那些為 null 值的屬性

仔細看 FastJson 轉換 Java 對象為 Json 的方法的入參:

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

可以看到 features 是一個數組 JSONWriter.Feature 則是其序列化屬性:

  • QuoteFieldNames———-輸出 key 時是否使用雙引號,默認為 true
  • WriteMapNullValue——–是否輸出值為 null 的字段,默認為 false
  • WriteNullNumberAsZero———-數值字段如果為 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:當我們需要把定義類的成員變量屬性名和返回的 Json 中的格式名稱隔離開,可以采用 @JSONField 注解標記??!

5、對象與 Json 互轉

# 對象轉 Json

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

# Json 轉對象

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);

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

相關文章

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

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

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

    Java8學習教程之lambda表達式語法介紹

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

    Maven模版Bug及解決辦法

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

    使用@RequiredArgsConstructor注解來取代繁瑣的@Autowrired

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

    解決MyBatis-Plus使用動態(tài)表名selectPage不生效的問題

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

    springboot中非容器類如何獲取配置文件數據

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

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

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

    java配置沙箱支付的實現示例

    箱支付是支付平臺提供的模擬支付環(huán)境,包含測試用的 APPID、密鑰、網關、測試賬號等資源,下面就來介紹一下如何實現,感興趣的可以了解一下
    2025-08-08
  • java使用Stream流對自定義對象數組去重的實現

    java使用Stream流對自定義對象數組去重的實現

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

    Springboot pom項目間接依賴包版本與預期不符原因解決分析

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

最新評論

大渡口区| 敦化市| 容城县| 台山市| 永善县| 青铜峡市| 勃利县| 佛冈县| 宝丰县| 庆云县| 龙江县| 临安市| 凤阳县| 商都县| 玉树县| 安福县| 休宁县| 浦东新区| 松原市| 武山县| 平武县| 木兰县| 涞水县| 柳江县| 大名县| 宜春市| 类乌齐县| 宽城| 澄迈县| 多伦县| 吉安县| 韶关市| 阿克陶县| 德清县| 定结县| 应用必备| 金溪县| 黄梅县| 新宁县| 潮安县| 新泰市|