java~jackson实现接口的反序列化

摘要:
Jackson是spring boot中的集成序列化方法,也是默认的json序列化方法。当然,您可以使用其他序列化工具来替换它。但今天我们仍然讨论它。使用Jackson来序列化一个类,然后将其JSON字符反序列化为其接口对象。ObjectMapperm=newObjectMapper();om.setVisibility;om.enableDefault键入;Useruser=newUser();user.setUsername;user.setEmail;Stringmsg=om.writeValueAsString;结果[“com.lind.common.JacksonTest$User”,{“用户名”:“lind”,“电子邮件”:“zzl@sina.com“,”当局“:null}]第二次序列化的主要优点是它与类型无关。只要可以配置字段,它就可以反序列化,并且在定义自定义序列化程序之后,它还可以反序列化接口类型,这更方便。定义序列化程序publicstaticassDefaultResourceUserSerializer extendsJsonDeserializer<DefaultResourceUser>{@OverridepublicDefaultResourceUserdeserixethrowsIOException{ObjectCodecoc=jsonParser.getCodec();JsonNodenode=oc.readTree;DefaultResourceUseruserAccountAuthentication=newDefaultResourceUser(){@OverridepublicStringgetUsername(){returnnode.get.asText();}@OverridepublicStringgetEmail(){returnnode.get.asTText();{@Overridepublic集合˂?

jackson是springboot中集成的序列化方式,是默认的json序列化方式,当然你可以使用其它的序列化工具代替它,不过今天我们还是说一下它,使用jackson进行序列化一个类,然后再把它的JSON字符反序列化为它的接口对象。

现实
  1. 这种方式默认是不行的,因为接口不能被自动实例化
  2. 使用redisTelmplete时,如果使用objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);这种试序列化,由于会把实例类型写到时 JSON里,所以也不能反序列化为接口
几个序列化方式

一 序列化为具体类型,无法反序列化接口,即你用什么类型序列化的,就用什么类型反序列化,它经常与redis的序列化Jackson2JsonRedisSerializer一起使用。

        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        User user = new User();
        user.setUsername("lind");
        user.setEmail("zzl@sina.com");
        String msg = om.writeValueAsString(user);

结果

["com.lind.common.JacksonTest$User",{"username":"lind","email":"zzl@sina.com","authorities":null}]

二 序列化为字符串,主要好处是与类型无关,只要字段可以配置上,就可以反序列化,并且在自定义序列化器定义之后,还可以对接口类型进行反序列化,可以说更加方便。
定义一个序列化器

 public static class DefaultResourceUserSerializer extends JsonDeserializer<DefaultResourceUser> {

        @Override
        public DefaultResourceUser deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
                throws IOException {
            ObjectCodec oc = jsonParser.getCodec();
            JsonNode node = oc.readTree(jsonParser);
            DefaultResourceUser userAccountAuthentication = new DefaultResourceUser() {
                @Override
                public String getUsername() {
                    return node.get("username").asText();
                }

                @Override
                public String getEmail() {
                    return node.get("email").asText();
                }

                @Override
                public Collection<? extends GrantedAuthority> getAuthorities() {
                    List<GrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
                    Iterator<JsonNode> elements = node.get("authorities").elements();
                    while (elements.hasNext()) {
                        JsonNode next = elements.next();
                        JsonNode authority = next.get("authority");
                        simpleGrantedAuthorities.add(new SimpleGrantedAuthority(authority.asText()));
                    }
                    return simpleGrantedAuthorities;
                }
            };
            return userAccountAuthentication;
        }

在接口上使用它
``
@JsonDeserialize(using = DefaultResourceUserSerializer.class)
public interface DefaultResourceUser {
String getUsername();

    String getEmail();

    Collection<? extends GrantedAuthority> getAuthorities();
}
代码展现了反序列化一个json字符串
json

{
"id": "347214418355949568",
"username": "admin",
"password": "{bcrypt}$2a$10$tVrm4VjC9BXF8PStUASZkOJCOm7mKR4ZVDHau.Ug/tm6ZEXEsHhcC",
"nickName": "测试",
"mobile": "",
"email": "",
"address": "北京",
"street": "",
"sex": 0,
"passStrength": "",
"avatar": "",
"type": 0,
"status": 0,
"description": "",
"departmentId": "",
"departmentTitle": null,
"resourcePermissions": [{
"id": "348193374957735936",
"title": "系统管理",
"path": "",
"type": 0,
"parentId": "",
"parent": null,
"sons": null
}, {
"id": "348193687223668737",
"title": "用户管理",
"path": "/user",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}, {
"id": "348193868908335105",
"title": "添加用户",
"path": "/user/add",
"type": 0,
"parentId": "348193687223668737",
"parent": null,
"sons": null
}, {
"id": "348193927590842369",
"title": "用户列表",
"path": "/user/list
",
"type": 0,
"parentId": "348193687223668737",
"parent": null,
"sons": null
}, {
"id": "348194428344602626",
"title": "权限管理",
"path": "/permission/**",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}, {
"id": "348194428344602627",
"title": "权限添加",
"path": "/permission/add*",
"type": 0,
"parentId": "348194428344602626",
"parent": null,
"sons": null
}, {
"id": "348194428344602628",
"title": "角色管理",
"path": "/role/list",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}, {
"id": "348194428344602629",
"title": "demo",
"path": "/demo",
"type": 0,
"parentId": "348193374957735936",
"parent": null,
"sons": null
}],
"resourceRoles": null,
"enabled": true,
"authorities": [{
"authority": "用户管理"
}, {
"authority": "添加用户"
}, {
"authority": "用户列表"
}, {
"authority": "权限管理"
}, {
"authority": "权限添加"
}, {
"authority": "角色管理"
}, {
"authority": "demo"
}],
"accountNonLocked": true,
"accountNonExpired": true,
"credentialsNonExpired": true
}

代码
@SneakyThrows
@Test
public void stringJackson() {
    DefaultResourceUser user = fromJson("jack.json", DefaultResourceUser.class);
    log.info("user:{}", user.getUsername());
    for (GrantedAuthority grantedAuthority : user.getAuthorities()) {
        log.info("auth:{}", grantedAuthority.getAuthority());
    }

}
结果

[1](https://img2020.cnblogs.com/blog/118538/202012/118538-20201209203450087-419672723.png)

免责声明:文章转载自《java~jackson实现接口的反序列化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux内核情景分析之信号实现Docker容器和K8s添加Health Check下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring源码阅读-IoC容器解析

目录 Spring IoC容器 ApplicationContext设计解析 BeanFactory ListableBeanFactory HierarchicalBeanFactory MessageSource ApplicationEventPublisher EnvironmentCapable ResourceLoader和Resour...

go学习-结构体与JSON序列化

结构体与JSON序列化 JSON数据与结构体之间相互转换 基本的序列化:json.Marshal()(序列化:结构体-->JSON格式的字符串)与json.Unmarshal(反序列化:JSON格式的字符串-->结构体) package main import ("fmt" "encoding/json" ) //Student 学生 ty...

是时候扔掉 Postman 了,Apifox 不香吗!

  偶然间发现这款测试工具Apifox,暂时还没有想好该把它叫接口测试工具还是辅助开发工具。但是,给我感觉,就是很好用,而且后面还有很多开发的功能是我很期待的。 根据官方给出的简单描述,它能做的事就是: Apifox = Postman + Swagger + Mock + JMeter 一、Apifox 介绍 Apifox 是接口管理、开发、测试全流...

Android 学习笔记之 JSON的序列化基本用法

最近在找怎样可以将一个数据对象通过WCF传给服务器,在网上看到了一个对象序列化成JSON的数据格式的帖子,这里整理下。 用到了JSON中的JSONStringer这个类,此类的主要功能就是可以快速的将一个数据类型序列化,成为一个标准的JSON数据。 其中需要注意的是: .object()和.endObject()必须同时使用,是为了按照Object标准给数值...

【网络开发】组播各种参数的设置及其意义

D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组。 单个网络上的组成员利用IGMP协议在系统之间通信。多播路由器用多播选录协议,如DVMRP(distance vector multicast  routing protocol,距离向量多播路由选择协议)传播成员信息。 在N...

硬盘接口详细解释

硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。 硬盘有固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 传统硬盘)、混合硬盘(HHD 一块基于传统机械硬盘诞生出来的新硬盘)。SSD采用闪存颗粒来存储,HDD采用磁性碟片来存储,混合硬盘(HHD: Hybrid Hard Disk)是把磁性硬盘和闪存集成到一起...