服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java序列化对象根据不同配置动态改变属性名的方法

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

2022-12-24 16:13shuai Java教程

本文主要介绍了java序列化对象根据不同配置动态改变属性名的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

使用场景:自己项目对接多个外部系统,各个外部系统使用的字段并没有统一,所以要根据不同系统动态的输出序列化数据,使适应各个系统的要求

实现方式

使用自定义注解和fastjson实现需求

fastjson的NameFilter的作用:序列化时,属性名变成自己指定的名称

实现过程

自定义注解一:MyParamName

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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进行匹配,匹配成功则使用对应的属性名

实体类,属性上添加自定义注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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 + '\'' +
                '}';
    }
}

运行主方法测试

?
1
2
3
4
5
6
7
8
9
10
11
12
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序列化对象改变属性名内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

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

延伸 · 阅读

精彩推荐