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

 更新时间:2024年08月19日 08:37:20   作者: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可以提高注解的可用性和准确性,确保注解被用在合适的上下文中。

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

处理步骤

  • 定义注解:创建一个注解@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字段重命名的资料请关注脚本之家其它相关文章!

相关文章

  • IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法

    IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法

    今天小编就为大家分享一篇关于IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 使用java API实现zip递归压缩和解压文件夹

    使用java API实现zip递归压缩和解压文件夹

    这篇文章主要介绍了使用java API实现zip递归压缩文件夹及解压,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • IDEA Maven依赖下载总是失败的几种解决方法

    IDEA Maven依赖下载总是失败的几种解决方法

    我们本地使用 IDEA 运行 maven 项目的时候,有时候运气不好,就会遇到某些 maven 依赖无法正常找到、导入,这就会导致 IDEA 构建项目的时候爆出一堆醒目的红色 Error,今天给大家分享IDEA Maven依赖下载总是失败的几种解决方法,感兴趣的朋友一起看看吧
    2023-09-09
  • Java C++题解leetcode817链表组件示例

    Java C++题解leetcode817链表组件示例

    这篇文章主要为大家介绍了Java C++题解leetcode817链表组件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • SpringMVC全局异常处理小结

    SpringMVC全局异常处理小结

    在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护,本文介绍SpringMVC全局异常处理,感兴趣的朋友一起看看吧
    2024-03-03
  • Springboot项目中内嵌sqlite数据库的配置流程

    Springboot项目中内嵌sqlite数据库的配置流程

    这篇文章主要介绍了Springboot项目中内嵌sqlite数据库的配置流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot详细讲解如何创建及刷新Spring容器bean

    SpringBoot详细讲解如何创建及刷新Spring容器bean

    前面看spring源码时可以发现refresh()方法十分重要。在这个方法中会加载beanDefinition,同时创建bean对象。那么在springboot中有没有使用这个refresh()方法呢
    2022-06-06
  • java实现登录验证码功能

    java实现登录验证码功能

    这篇文章主要为大家详细介绍了java实现登录验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java for循环倒序输出的操作代码

    Java for循环倒序输出的操作代码

    在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现,这篇文章主要介绍了Java for循环倒序输出,需要的朋友可以参考下
    2024-07-07
  • springboot将mybatis升级为mybatis-plus的实现

    springboot将mybatis升级为mybatis-plus的实现

    之前项目工程用的是mybatis,现在需要将其替换为mybatis-plus,本文主要介绍了springboot将mybatis升级为mybatis-plus的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论