您现在的位置是:首页 > Javascript
当前栏目
Spring Boot中使用@JsonComponent
2023-04-18 13:08:37 时间
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的博客
相关文章
- Rust 是 JavaScript 基础设施的未来
- npm现代前端开发的基石,共享代码从此不再用百度下载了
- 死生之地不可不察:论API标准化对Dapr的重要性
- 前端面试 【JavaScript】— 什么是闭包?
- 前端面试 【JavaScript】— 闭包产生的原因?
- 前端面试 【JavaScript】— 闭包有哪些表现形式?
- 前端面试 【JavaScript】— 原型对象和构造函数有何关系?
- 前端面试 【JavaScript】— 能不能描述一下原型链?
- c# HttpWebRequest 解决 请求HTTPS慢
- CSS详解(1.什么是css)
- 为什么选择 Traefik Ingress ?
- js堆栈内存
- Java Review - 并发组件ConcurrentHashMap使用时的注意事项及源码分析
- @所有人 你期待的「网站建设」产品功能升级来啦!
- SpringBoot监控工具之《Actuator》
- 前端面试 【JavaScript】— 函数的arguments为什么不是数组?如何转化成数组?
- 前端面试 【JavaScript】— JS如何实现继承?
- js逆向-猿人学(15-16)wasm-webpack
- js逆向-猿人学(14)备而后动-勿使有变
- Js逆向-猿人学(1)源码混淆