zoukankan      html  css  js  c++  java
  • Spring Boot中使用@JsonComponent


    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的博客

  • 相关阅读:
    运动检测技术在数字化监控中的实现和应用(作者:何峻峰)
    EF BB BF的问题
    理解HTTP幂等性
    FusionCharts 分类以及各个属性 参数列表
    SQL语言包含的四个部分
    Inno Setup (安装程序制作)
    PowerDesigner 参照完整性约束(级联删除)
    java默认语法、EL、JSTL表达式,JSTL和struts Tag标签的使用总结
    修改PowerDesigner中create index的bug
    神奇的java Object ( Object和数组关系) Object数据互转
  • 原文地址:https://www.cnblogs.com/flydean/p/12680300.html
Copyright © 2011-2022 走看看