欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

Java注解(Annotation)

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

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

類似這樣~

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

Java的反射(Reflection)

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

org.json

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

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

@Target 注解

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

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

處理步驟

  • 定義注解:創(chuàng)建一個注解@AutoRename,用于標(biāo)記需要自動重命名屬性的類。
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) // 運行時保留
public @interface AutoRename {
}
  • 編寫JSON轉(zhuǎn)換工具:實現(xiàn)一個工具類,用于處理JSON字符串,并根據(jù)注解自動重命名屬性。

附完整代碼:

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ù)對象類上。

@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();
        }
    }
}

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

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

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

相關(guān)文章

  • TransmittableThreadLocal解決線程間上下文傳遞煩惱

    TransmittableThreadLocal解決線程間上下文傳遞煩惱

    這篇文章主要為大家介紹了TransmittableThreadLocal解決線程間上下文傳遞煩惱詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • MybatisPlus多表連接查詢的具體實現(xiàn)

    MybatisPlus多表連接查詢的具體實現(xiàn)

    MyBatis Plus是一款針對MyBatis框架的增強(qiáng)工具, 它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,本文主要介紹了MybatisPlus多表連接查詢的具體實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Java調(diào)用DOS實現(xiàn)定時關(guān)機(jī)的實例

    Java調(diào)用DOS實現(xiàn)定時關(guān)機(jī)的實例

    Java調(diào)用DOS實現(xiàn)定時關(guān)機(jī)的實例,需要的朋友可以參考一下
    2013-04-04
  • 舉例詳解Java編程中HashMap的初始化以及遍歷的方法

    舉例詳解Java編程中HashMap的初始化以及遍歷的方法

    這篇文章主要介紹了Java編程中HashMap的初始化以及遍歷的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解,線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲,需要的朋友可以參考下
    2023-07-07
  • MyBatis-Plus自定義SQL的詳細(xì)過程記錄

    MyBatis-Plus自定義SQL的詳細(xì)過程記錄

    Java開發(fā)使用mybatis-plus來執(zhí)行sql操作,往往比mybatis能夠省時省力,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus自定義SQL的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Java實現(xiàn)一個簡單計算器

    Java實現(xiàn)一個簡單計算器

    這篇文章主要介紹了Java實現(xiàn)一個簡單計算器,文章我圍繞實現(xiàn)簡單計算器的相關(guān)代碼展現(xiàn)全文,具有一定的參考價值,需要的小伙伴可以參考一下,
    2022-01-01
  • 簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解Spring框架入門

    詳解Spring框架入門

    這篇文章主要介紹了詳解Spring框架入門,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Druid監(jiān)控分布式實現(xiàn)過程解析

    Druid監(jiān)控分布式實現(xiàn)過程解析

    這篇文章主要介紹了Druid監(jiān)控分布式實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論