Spring Boot中使用@JsonComponent

@JsonComponent 是Spring boot的核心注解,使用@JsonComponent 之后就不需要手动将Jackson的序列化和反序列化手动加入ObjectMapper了。使用这个注解就够了。

序列化

假如我们有个User类,它里面有一个Color属性:

@Data
@AllArgsConstructor
public class User {
private Color favoriteColor;
}

接下来我们来创建针对User的序列化组件,我们需要实现JsonSerializer接口:

@JsonComponent
public class UserJsonSerializer extends JsonSerializer<User> { @Override
public void serialize(User user, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException,
JsonProcessingException { jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(
"favoriteColor",
getColorAsWebColor(user.getFavoriteColor()));
jsonGenerator.writeEndObject();
} private static String getColorAsWebColor(Color color) {
int r = (int) Math.round(color.getRed() * 255.0);
int g = (int) Math.round(color.getGreen() * 255.0);
int b = (int) Math.round(color.getBlue() * 255.0);
return String.format("#%02x%02x%02x", r, g, b);
}
}

在上面的类中,我们自定义了序列化的方法。接下来我们测试一下:

@JsonTest
@RunWith(SpringRunner.class)
public class UserJsonSerializerTest { @Autowired
private ObjectMapper objectMapper; @Test
public void testSerialization() throws JsonProcessingException {
User user = new User(Color.ALICEBLUE);
String json = objectMapper.writeValueAsString(user); assertEquals("{\"favoriteColor\":\"#f0f8ff\"}", json);
}
}

反序列化

同样的,我们实现JsonDeserializer接口:

@JsonComponent
public class UserJsonDeserializer extends JsonDeserializer<User> { @Override
public User deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException,
JsonProcessingException { TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);
TextNode favoriteColor
= (TextNode) treeNode.get("favoriteColor");
return new User(Color.web(favoriteColor.asText()));
}
}

我们看下怎么调用:

@JsonTest
@RunWith(SpringRunner.class)
public class UserJsonDeserializerTest { @Autowired
private ObjectMapper objectMapper; @Test
public void testDeserialize() throws IOException {
String json = "{\"favoriteColor\":\"#f0f8ff\"}"
User user = objectMapper.readValue(json, User.class); assertEquals(Color.ALICEBLUE, user.getFavoriteColor());
}
}

在同一个class中序列化和反序列化

@JsonComponent
public class UserCombinedSerializer { public static class UserJsonSerializer
extends JsonSerializer<User> { @Override
public void serialize(User user, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException,
JsonProcessingException { jsonGenerator.writeStartObject();
jsonGenerator.writeStringField(
"favoriteColor", getColorAsWebColor(user.getFavoriteColor()));
jsonGenerator.writeEndObject();
} private static String getColorAsWebColor(Color color) {
int r = (int) Math.round(color.getRed() * 255.0);
int g = (int) Math.round(color.getGreen() * 255.0);
int b = (int) Math.round(color.getBlue() * 255.0);
return String.format("#%02x%02x%02x", r, g, b);
}
} public static class UserJsonDeserializer
extends JsonDeserializer<User> { @Override
public User deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException, JsonProcessingException { TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);
TextNode favoriteColor = (TextNode) treeNode.get(
"favoriteColor");
return new User(Color.web(favoriteColor.asText()));
}
}
}

为了方便,我们还可以在同一个类中定义两个内部类来实现序列化和反序列化。如上所示。

本文的例子可以参考https://github.com/ddean2009/learn-springboot2/tree/master/springboot-jsoncomponent

更多教程请参考 flydean的博客

Spring Boot中使用@JsonComponent的更多相关文章

  1. spring boot(三):Spring Boot中Redis的使用

    spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...

  2. Spring Boot中的事务管理

    原文  http://blog.didispace.com/springboottransactional/ 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合 ...

  3. Spring Boot中的注解

    文章来源:http://www.tuicool.com/articles/bQnMra 在Spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了 ...

  4. 在Spring Boot中使用Https

    本文介绍如何在Spring Boot中,使用Https提供服务,并将Http请求自动重定向到Https. Https证书 巧妇难为无米之炊,开始的开始,要先取得Https证书.你可以向证书机构申请证书 ...

  5. Spring Boot中使用Swagger2构建强大的RESTful API文档

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

  6. Dubbo在Spring和Spring Boot中的使用

    一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifa ...

  7. springboot(十一):Spring boot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  8. springboot(三):Spring boot中Redis的使用

    spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结 ...

  9. Spring Boot中使用Swagger2构建API文档

    程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...

随机推荐

  1. 为什么Swift和Python要抛弃++\--?

    简单好用的++.-- 说到自增(++)\自减(--)运算符,小伙伴们应该都不会陌生,在很多编程语言的代码中,都经常出现它们的身影. 比如常用的for语句 for (int i = 0; i < ...

  2. 1039 Course List for Student (25分)

    Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists o ...

  3. Java 使用InputStream笔记

    当我们要从网络下载资源时,使用类似如下方法来获取InputStream实例: URLConnection connection = new URL("http://www.XXXX.XXX& ...

  4. JAVABEAN的SCOPE属性(转载)

    对于JSP 程序而言,使用JavaBeans  组件不仅可以封装许多信息,而且还可以将一些 数据处理的逻辑隐藏到JavaBeans  的内部,除此之外,我们还可以设定JavaBeans  的Scope ...

  5. 配置一个mariadb数据库《二》

                                                             mariadb 配置一个数据库 案例4:配置一个数据库 4.1 问题 本例要求在虚拟机 ...

  6. Jenkins Pipeline 持续集成

    Jenkins Pipeline 持续集成 Pipeline Script 执行流程 在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件. Jenkins提 ...

  7. Java字符串的应用

    字符串的简单应用 public class join { public static void main (String args[]){ String s1 = new String (" ...

  8. Python爬虫系列(七):提高解析效率

    如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文 ...

  9. Byte字节

    字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位.最常用的字节是八位的字节,即它包含八位的二进制数. 中文名 字节 外文名 ...

  10. cxx signal信号捕获

    kill -9 [pid] 该信号不能被捕获 #include <iostream> #include <csignal> static void vSignalHandler ...