- 作者:老汪软件技巧
- 发表时间:2024-08-19 15:05
- 浏览量:
不知道有没有同学遇到过对接业务方代码非常“独具一格”(不符合通用规范且不愿意配合修改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.googlegroupId>
<artifactId>android-jsonartifactId>
<version>0.0.20131108.vaadin1version>
<scope>compilescope>
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 fromJson(String json, Class 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字段。
我们看下执行结果: