首页>>后端>>java->java序列化对象,根据不同配置动态改变属性名

java序列化对象,根据不同配置动态改变属性名

时间:2023-12-06 本站 点击:0

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序列化对象,根据不同配置动态改变属性名

原文:https://juejin.cn/post/7101517823695912990


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/15954.html