本文主要介绍了java序列化对象根据不同配置动态改变属性名的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
使用场景:自己项目对接多个外部系统,各个外部系统使用的字段并没有统一,所以要根据不同系统动态的输出序列化数据,使适应各个系统的要求
实现方式
使用自定义注解和fastjson实现需求
fastjson的NameFilter的作用:序列化时,属性名变成自己指定的名称
实现过程
自定义注解一:MyParamName
package xin.yangshuai.cipher.json;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* MyParamName
*
* @author shuai
* @date 2021/3/23
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface MyParamName {
String value() default "";
NameEle[] names() default {};
}
value、names都是非必填
value:默认序列化的名称
names:自定义注解二,数组形式
自定义注解二:NameEle
package xin.yangshuai.cipher.json;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* NameEle
*
* @author shuai
* @date 2021/3/24
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface NameEle {
String id();
String value();
}
id:唯一标识,确定序列化后的属性名
value:定义序列化后的属性名
手写MyNameFilter,实现fastjson的NameFilter
package xin.yangshuai.cipher.json;
import com.alibaba.fastjson.serializer.NameFilter;
import java.lang.reflect.Field;
/**
* MyNameFilter
*
* @author shuai
* @date 2021/3/23
*/
public class MyNameFilter implements NameFilter {
private String id;
public MyNameFilter() {
}
public MyNameFilter(String id) {
this.id = id;
}
@Override
public String process(Object o, String name, Object value) {
try {
Field field = o.getClass().getDeclaredField(name);
MyParamName myParamName = field.getDeclaredAnnotation(MyParamName.class);
NameEle[] nameEles = myParamName.names();
String defaultName = myParamName.value();
if (nameEles.length == 0 && defaultName.length() > 0) {
return defaultName;
}
for (NameEle n : nameEles) {
if (id.equals(n.id())) {
return n.value();
}
}
} catch (Exception e) {
return name;
}
return name;
}
}
构造方法传递id属性的值,与自定义注解二的id进行匹配,匹配成功则使用对应的属性名
实体类,属性上添加自定义注解
package xin.yangshuai.cipher.json;
import com.alibaba.fastjson.JSON;
/**
* Person
*
* @author shuai
* @date 2021/3/23
*/
public class Person {
@MyParamName(names = {
@NameEle(id = "ln", value = "i_d"),
@NameEle(id = "jl", value = "_id")})
private String id;
@MyParamName("NAME")
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
运行主方法测试
public static void main(String[] args) {
Person person = new Person();
person.setAge("18");
person.setId("001");
person.setName("张三");
String s = JSON.toJSONString(person, new MyNameFilter("jl"));
System.out.println(s);
String s1 = JSON.toJSONString(person, new MyNameFilter("ln"));
System.out.println(s1);
}
结果为:
{"age":"18","_id":"001","NAME":"张三"} {"age":"18","i_d":"001","NAME":"张三"}
参考
# java序列化对象,根据不同配置动态改变属性名
到此这篇关于java序列化对象根据不同配置动态改变属性名的方法的文章就介绍到这了,更多相关java序列化对象改变属性名内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:java序列化对象根据不同配置动态改变属性名的方法
基础教程推荐
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现查找文件和替换文件内容 2023-04-06
- Java数据结构之对象比较详解 2023-03-07
- Java并发编程进阶之线程控制篇 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- Java实现线程插队的示例代码 2022-09-03
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- java实现多人聊天系统 2023-05-19
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02