java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java JSON字段重命名

使用Java注解和反射实现JSON字段自动重命名

作者:AQin

这篇文章主要介绍了如何使用Java注解和反射实现JSON字段自动重命名,文中通过代码示例和图文介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

不知道有没有同学遇到过对接业务方代码非常“独具一格”(不符合通用规范且不愿意配合修改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可以提高注解的可用性和准确性,确保注解被用在合适的上下文中。

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

处理步骤

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 {
}

附完整代码:

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 ;
}
}
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字段重命名的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文