使用Java注解和反射實現(xiàn)JSON字段自動重命名
不知道有沒有同學遇到過對接業(yè)務方代碼非常“獨具一格”(不符合通用規(guī)范且不愿意配合修改emmmm。。。),于是就只能“被迫”按他的格式來,但是又不想因為他的不規(guī)范導致我們自己創(chuàng)建的接收對象也非常的“一言難盡”。。。今天這篇幫你解決這個問題~(老規(guī)矩:附完整可執(zhí)行代碼)
先給初學Java的同學補下基礎,涉及到一些實現(xiàn)這個功能需要的知識點(了解的朋友可以直接跳過~)
Java注解(Annotation)
Java注解(Annotation)是一種特殊的標記,用于在Java代碼中提供元數(shù)據(jù)(Metadata)。
而元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),而在Java中,注解可以提供關(guān)于類、方法、變量、參數(shù)、包等的附加信息。
類似這樣~

注解不會直接影響代碼的執(zhí)行,但它們可以被編譯器或運行時環(huán)境用來實現(xiàn)特定的處理或行為(這也是我們這篇文章用到他的原因)。
Java的反射(Reflection)
Java的反射(Reflection)是一種灰常~強大的機制,它允許程序在運行時(Runtime)查詢、訪問和修改它自身的結(jié)構(gòu)和行為(反射提供了一種動態(tài)的訪問和操作類、接口、方法、構(gòu)造函數(shù)、字段等的能力,所以可以在對象未知的情況下對對象進行操作)
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),它用于指定其他注解可以應用于哪些Java元素。@Target本身不能直接用在除了注解定義之外的地方。使用@Target可以提高注解的可用性和準確性,確保注解被用在合適的上下文中。

好啦~用到的東西基本就是這些,正文開始!>>>>>>>
處理步驟
- 定義注解:創(chuàng)建一個注解
@AutoRename,用于標記需要自動重命名屬性的類。
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對象中對應的字段,然后根據(jù)字段類型將JSON值賦給Java字段。
我們看下執(zhí)行結(jié)果:

以上就是使用Java注解和反射實現(xiàn)JSON字段自動重命名的詳細內(nèi)容,更多關(guān)于Java JSON字段重命名的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TransmittableThreadLocal解決線程間上下文傳遞煩惱
這篇文章主要為大家介紹了TransmittableThreadLocal解決線程間上下文傳遞煩惱詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
Java調(diào)用DOS實現(xiàn)定時關(guān)機的實例
Java調(diào)用DOS實現(xiàn)定時關(guān)機的實例,需要的朋友可以參考一下2013-04-04
Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解,線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數(shù)組和鏈式結(jié)構(gòu)的形式存儲,需要的朋友可以參考下2023-07-07
簡單的理解java集合中的HashSet和HashTree幾個重寫方法
這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10

