• 作者:老汪软件技巧
  • 发表时间: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可以提高注解的可用性和准确性,确保注解被用在合适的上下文中。

反射shell__反射dll

好啦~用到的东西基本就是这些,正文开始!>>>>>>>

处理步骤定义注解:创建一个注解@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字段。

我们看下执行结果: