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

使用Java注解和反射實(shí)現(xiàn)JSON字段自動(dòng)重命名

 更新時(shí)間:2024年08月19日 08:37:20   作者:AQin  
這篇文章主要介紹了如何使用Java注解和反射實(shí)現(xiàn)JSON字段自動(dòng)重命名,文中通過代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

不知道有沒有同學(xué)遇到過對(duì)接業(yè)務(wù)方代碼非常“獨(dú)具一格”(不符合通用規(guī)范且不愿意配合修改emmmm。。。),于是就只能“被迫”按他的格式來,但是又不想因?yàn)樗牟灰?guī)范導(dǎo)致我們自己創(chuàng)建的接收對(duì)象也非常的“一言難盡”。。。今天這篇幫你解決這個(gè)問題~(老規(guī)矩:附完整可執(zhí)行代碼)

先給初學(xué)Java的同學(xué)補(bǔ)下基礎(chǔ),涉及到一些實(shí)現(xiàn)這個(gè)功能需要的知識(shí)點(diǎn)(了解的朋友可以直接跳過~)

Java注解(Annotation)

Java注解(Annotation)是一種特殊的標(biāo)記,用于在Java代碼中提供元數(shù)據(jù)(Metadata)。

而元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),而在Java中,注解可以提供關(guān)于類、方法、變量、參數(shù)、包等的附加信息。

類似這樣~

注解不會(huì)直接影響代碼的執(zhí)行,但它們可以被編譯器或運(yùn)行時(shí)環(huán)境用來實(shí)現(xiàn)特定的處理或行為(這也是我們這篇文章用到他的原因)。

Java的反射(Reflection)

Java的反射(Reflection)是一種灰常~強(qiáng)大的機(jī)制,它允許程序在運(yùn)行時(shí)(Runtime)查詢、訪問和修改它自身的結(jié)構(gòu)和行為(反射提供了一種動(dòng)態(tài)的訪問和操作類、接口、方法、構(gòu)造函數(shù)、字段等的能力,所以可以在對(duì)象未知的情況下對(duì)對(duì)象進(jìn)行操作)

org.json

org.json是一個(gè)在Java中用于處理JSON數(shù)據(jù)的庫(Java自帶的,類似Gson或JSON-B),它提供了一系列的API來創(chuàng)建、解析和操作JSON對(duì)象,需要添加如下依賴:

<dependency>
    <groupId>com.vaadin.external.google</groupId>
    <artifactId>android-json</artifactId>
    <version>0.0.20131108.vaadin1</version>
    <scope>compile</scope>
</dependency>

@Target 注解

Java中的@Target注解是一個(gè)元注解(meta-annotation),它用于指定其他注解可以應(yīng)用于哪些Java元素。@Target本身不能直接用在除了注解定義之外的地方。使用@Target可以提高注解的可用性和準(zhǔn)確性,確保注解被用在合適的上下文中。

好啦~用到的東西基本就是這些,正文開始!>>>>>>>

處理步驟

  • 定義注解:創(chuàng)建一個(gè)注解@AutoRename,用于標(biāo)記需要自動(dòng)重命名屬性的類。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE) // 用于類
@Retention(RetentionPolicy.RUNTIME) // 運(yùn)行時(shí)保留
public @interface AutoRename {
}
  • 編寫JSON轉(zhuǎn)換工具:實(shí)現(xiàn)一個(gè)工具類,用于處理JSON字符串,并根據(jù)注解自動(dòng)重命名屬性。

附完整代碼:

import org.json.JSONObject;
import java.lang.reflect.Field;
import java.util.Iterator;

public class JsonAutoRenamer {

    public static <T> T fromJson(String json, Class<T> clazz) throws Exception {
        JSONObject jsonObject = new JSONObject(json);
        T instance = clazz.getDeclaredConstructor().newInstance();

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            String key = field.getName(); // 獲取駝峰式命名
            String dataKey = key.replaceAll("([a-z0-9])([A-Z])", "$1_$2").toLowerCase(); // 轉(zhuǎn)換為下劃線分隔

            Object value = jsonObject.has(dataKey) ? jsonObject.get(dataKey) : null;
            if (value != null) {
                // 根據(jù)字段類型轉(zhuǎn)換值
                Class<?> fieldType = field.getType();
                if (fieldType == String.class) {
                    field.set(instance, value.toString());
                } else if (fieldType == int.class || fieldType == Integer.class) {
                    field.set(instance, (Integer) value);
                } else if (fieldType == boolean.class || fieldType == Boolean.class) {
                    field.set(instance, (Boolean) value);
                } else if (fieldType == double.class || fieldType == Double.class) {
                    field.set(instance, (Double) value);
                } // ...其他類型處理(如果有的話)
            }
        }

        return instance;
    }
}
  • 使用注解:將注解添加到你的數(shù)據(jù)對(duì)象類上。

@AutoRename
public class UserResponse {
    private String userName ;
private Integer age ;

public UserResponse() {
    }

    public UserResponse(String userName , Integer age) {
        this.userName = userName ;
this.age = age ;
}

    public String getUserName() {
        return userName ;
}

    public void setUserName(String userName) {
        this.userName = userName ;
}

    public Integer getAge() {
        return age ;
}

    public void setAge(Integer age) {
        this.age = age ;
}
}
  • 處理JSON字符串:在獲取接口返回的JSON字符串后,使用JsonAutoRenamer來處理字符串。

public class Main {
    public static void main(String[] args) {
        String json = "{"user_name":"John Doe","age":30}";

        try {
            UserResponse userResponse = JsonAutoRenamer.fromJson(json, UserResponse.class);
            // 現(xiàn)在 userResponse 中的字段已經(jīng)被賦值
            System.out.println("User Name: " + userResponse.getUserName());
            System.out.println("Age: " + userResponse.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

請(qǐng)注意,這個(gè)示例使用了Java自帶的org.json.JSONObject來解析JSON字符串。JsonAutoRenamer類中的fromJson方法會(huì)遍歷JSON對(duì)象中的每個(gè)鍵值對(duì),并使用反射來找到Java對(duì)象中對(duì)應(yīng)的字段,然后根據(jù)字段類型將JSON值賦給Java字段。

我們看下執(zhí)行結(jié)果:

以上就是使用Java注解和反射實(shí)現(xiàn)JSON字段自動(dòng)重命名的詳細(xì)內(nèi)容,更多關(guān)于Java JSON字段重命名的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法

    IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 使用java API實(shí)現(xiàn)zip遞歸壓縮和解壓文件夾

    使用java API實(shí)現(xiàn)zip遞歸壓縮和解壓文件夾

    這篇文章主要介紹了使用java API實(shí)現(xiàn)zip遞歸壓縮文件夾及解壓,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • IDEA Maven依賴下載總是失敗的幾種解決方法

    IDEA Maven依賴下載總是失敗的幾種解決方法

    我們本地使用 IDEA 運(yùn)行 maven 項(xiàng)目的時(shí)候,有時(shí)候運(yùn)氣不好,就會(huì)遇到某些 maven 依賴無法正常找到、導(dǎo)入,這就會(huì)導(dǎo)致 IDEA 構(gòu)建項(xiàng)目的時(shí)候爆出一堆醒目的紅色 Error,今天給大家分享IDEA Maven依賴下載總是失敗的幾種解決方法,感興趣的朋友一起看看吧
    2023-09-09
  • Java?C++題解leetcode817鏈表組件示例

    Java?C++題解leetcode817鏈表組件示例

    這篇文章主要為大家介紹了Java?C++題解leetcode817鏈表組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • SpringMVC全局異常處理小結(jié)

    SpringMVC全局異常處理小結(jié)

    在開發(fā)中,不管是dao層、service層還是controller層,都有可能拋出異常,在springmvc中,能將所有類型的異常處理從各處理過程解耦出來,既保證了相關(guān)處理過程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù),本文介紹SpringMVC全局異常處理,感興趣的朋友一起看看吧
    2024-03-03
  • Springboot項(xiàng)目中內(nèi)嵌sqlite數(shù)據(jù)庫的配置流程

    Springboot項(xiàng)目中內(nèi)嵌sqlite數(shù)據(jù)庫的配置流程

    這篇文章主要介紹了Springboot項(xiàng)目中內(nèi)嵌sqlite數(shù)據(jù)庫的配置流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean

    SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean

    前面看spring源碼時(shí)可以發(fā)現(xiàn)refresh()方法十分重要。在這個(gè)方法中會(huì)加載beanDefinition,同時(shí)創(chuàng)建bean對(duì)象。那么在springboot中有沒有使用這個(gè)refresh()方法呢
    2022-06-06
  • java實(shí)現(xiàn)登錄驗(yàn)證碼功能

    java實(shí)現(xiàn)登錄驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)登錄驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java?for循環(huán)倒序輸出的操作代碼

    Java?for循環(huán)倒序輸出的操作代碼

    在Java中,要實(shí)現(xiàn)一個(gè)for循環(huán)的倒序輸出,通常我們會(huì)使用數(shù)組或集合(如ArrayList)作為數(shù)據(jù)源,然后通過倒序遍歷這個(gè)數(shù)組或集合來實(shí)現(xiàn),這篇文章主要介紹了Java?for循環(huán)倒序輸出,需要的朋友可以參考下
    2024-07-07
  • springboot將mybatis升級(jí)為mybatis-plus的實(shí)現(xiàn)

    springboot將mybatis升級(jí)為mybatis-plus的實(shí)現(xiàn)

    之前項(xiàng)目工程用的是mybatis,現(xiàn)在需要將其替換為mybatis-plus,本文主要介紹了springboot將mybatis升級(jí)為mybatis-plus的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

琼结县| 江华| 肥城市| 古交市| 图们市| 静宁县| 房山区| 景宁| 淄博市| 余江县| 南投县| 南丰县| 宜兴市| 交口县| 南漳县| 柏乡县| 建昌县| 白银市| 汽车| 剑阁县| 旬邑县| 尚志市| 威信县| 南投县| 泌阳县| 三原县| 曲阳县| 中方县| 绥宁县| 邛崃市| 永济市| 宿迁市| 清水河县| 电白县| 镇康县| 彩票| 凤山县| 南昌县| 泌阳县| 呼图壁县| 仁怀市|