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

现实

这种方式默认是不行的,因为接口不能被自动实例化

使用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 {

@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 simpleGrantedAuthorities = new ArrayList<>();

Iterator 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)

jackson java网络接口_java~jackson实现接口的反序列化相关推荐

  1. mysql接口java代码_java改成接口类

    类图 1.如果开发java项目最好设置如下:----->Tools ----->Option---->Notation---->Default中的值改成Java 2.将模型转换 ...

  2. predicate java 作用_Java函数式编程接口详解之Predicate

    一.初识 Predicate是Java提供的重要的函数编程接口之一,作用主要是用于逻辑判断. 首先看看源码: @FunctionalInterface public interface Predica ...

  3. java网络接口_java网络编程之识别示例 获取主机网络接口列表

    importjava.net.*; importjava.util.Enumeration; publicclassInetAddressExample{ publicstaticvoidmain(S ...

  4. java 火车票_Java 面向对象 之 接口 火车票实例

    /** 接口的实际应用: 题目: 两个人A,B开发一个火车票显示功能A负责客户端, B负责服务器端 思路: 1. 抽象出类: 1.1 客户端显示类(Terminal) 1.2 服务器端服务类(Trai ...

  5. JAVA飞信_java调用飞信接口发短信 - 贪吃蛇学院-专业IT技术平台

    java调用飞信接口发短信,看到挺好的,有利于大家做毕业设计加亮点,就发给大家了(新人发帖,不会发多个文件名,测试类就放这了) 需要这3个jar包: commons-codec-1.4.jar com ...

  6. java来电_JAVA来电显示接口调用代码实例

    代码描述:基于JAVA的来电显示接口调用代码实例 关联数据:手机固话来电显示 接口地址:http://www.juhe.cn/docs/api/id/72 import java.io.Buffere ...

  7. app中传递java数据_Java实现app接口和Socket消息传递(6)servlet映射并返回Json数据

    原创: http://blog.csdn.net/iwanghang 1.建立Servers,根据你安装的Tomcat选择. 2.选择Tomcat路径.JRE版本可以选择项目默认或者选择你自己的JRE ...

  8. java 打印机_java调用打印机接口

    全部代码: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt ...

  9. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化 转载于:https://www.cnblogs.com/jing1617/p/7009122.html

最新文章

  1. 简单快速修改大量重复代码(Intellij IDEA)
  2. iOS超全开源框架、项目和学习资料汇总:UI篇
  3. 什么是1+N模式的新一代城市大脑建设方案
  4. 移动端数据java后台接收
  5. C# Cookie操作类
  6. gitlab+keepalived
  7. 管理表空间和数据文件——维护表空间——设置默认表空间和删除表空间和删除数据文件盒临时文件...
  8. RocketMQ如何动态扩容和缩容
  9. 通俗的说这是一个一对多的例子,看看人家是怎么做的!
  10. popen后用fgets读数据的问题
  11. ENVI监督分类后背景值也被分成一种地物,解决方案和转移矩阵制作方法
  12. bcd 初始化库系统卷失败_应用程序正常初始化失败怎么办
  13. 怎么样添加桌面我的计算机,怎么样把我的电脑添加到桌面上
  14. 企业微信社群运营必建的4个内容体系
  15. 【点赞收藏】36个顶级数据分析方法与模型!
  16. 【电脑自动关机】开机后Mysql再也启动不起来了。问题解决
  17. css3 3D立体相册实现
  18. 中秋国庆长假,SEO你在坚持吗?
  19. 尔宾团队角色(Belbin Team Roles),亦被称为贝尔宾团队角色表(Belbin Team Inventory)
  20. 1569 B.Chess Tournament

热门文章

  1. ajax请求 apend,jsp如何获取ajax append的数据?
  2. 二级c语言上机题库及解析,2013年计算机二级C语言上机题库及答案解析(3)
  3. JAVA中CyclLink怎么用_Java多线程基本使用一
  4. vue 转为静态html,Vue CLI 3使用:HTML和静态资源(五)
  5. Shell 脚本知识回顾 (三) —— 替换、运算符、字符串、数组
  6. gsoap使用心得!
  7. linux内存映射函数mmap
  8. vsftpd默认用户名/密码
  9. pdf上传及预览;file上传pdf文件及预览;vue上传pdf文件及预览;vue-pdf预览pdf文件
  10. [react-router] 请你说说react的路由是什么?