使用Java注解和反射实现JSON字段自动重命名
作者:AQin
不知道有没有同学遇到过对接业务方代码非常“独具一格”(不符合通用规范且不愿意配合修改emmmm。。。),于是就只能“被迫”按他的格式来,但是又不想因为他的不规范导致我们自己创建的接收对象也非常的“一言难尽”。。。今天这篇帮你解决这个问题~(老规矩:附完整可执行代码)
先给初学Java的同学补下基础,涉及到一些实现这个功能需要的知识点(了解的朋友可以直接跳过~)
Java注解(Annotation)
Java注解(Annotation)是一种特殊的标记,用于在Java代码中提供元数据(Metadata)。
而元数据是描述数据的数据,而在Java中,注解可以提供关于类、方法、变量、参数、包等的附加信息。
类似这样~
注解不会直接影响代码的执行,但它们可以被编译器或运行时环境用来实现特定的处理或行为(这也是我们这篇文章用到他的原因)。
Java的反射(Reflection)
Java的反射(Reflection)是一种灰常~强大的机制,它允许程序在运行时(Runtime)查询、访问和修改它自身的结构和行为(反射提供了一种动态的访问和操作类、接口、方法、构造函数、字段等的能力,所以可以在对象未知的情况下对对象进行操作)
org.json
org.json是一个在Java中用于处理JSON数据的库(Java自带的,类似Gson或JSON-B),它提供了一系列的API来创建、解析和操作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
可以提高注解的可用性和准确性,确保注解被用在合适的上下文中。
好啦~用到的东西基本就是这些,正文开始!>>>>>>>
处理步骤
- 定义注解:创建一个注解
@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转换工具:实现一个工具类,用于处理JSON字符串,并根据注解自动重命名属性。
附完整代码:
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(); // 转换为下划线分隔 Object value = jsonObject.has(dataKey) ? jsonObject.get(dataKey) : null; if (value != null) { // 根据字段类型转换值 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; } }
使用注解:将注解添加到你的数据对象类上。
@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); // 现在 userResponse 中的字段已经被赋值 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对象中对应的字段,然后根据字段类型将JSON值赋给Java字段。
我们看下执行结果:
以上就是使用Java注解和反射实现JSON字段自动重命名的详细内容,更多关于Java JSON字段重命名的资料请关注脚本之家其它相关文章!