【问题标题】:Custom serialization without annotations没有注释的自定义序列化
【发布时间】:2022-01-24 18:27:58
【问题描述】:

在 Springboot 上有没有一种方法可以在我的请求中为特定字段实现自定义序列化程序而无需进行注释?

如果我们可以创建一个 bean 或覆盖一个配置并序列化一个字符串输入(来自 json 请求)到我的请求 pojo 上的 OffsetDateTime 字段,我更喜欢。

我无法注释,因为我的请求类是自动生成的..

【问题讨论】:

    标签: java spring-boot serialization jackson offsetdatetime


    【解决方案1】:

    您可以在 jackson.xml 中以编程方式注册序列化程序。需要自定义序列化的类:

    public class SpecialObject {
    
        private String field;
        private String anotherField;
    
        //getters, setters
    }
    

    包装类,它是一个字段:

    public class WrapperObject {
    
        private String text;
        private SpecialObject specialObject;
    
        //getters, setters
    }
    

    序列化器:

    public class SpecialObjectSerializer extends StdSerializer<SpecialObject> {
    
        public SpecialObjectSerializer() {
            super(SpecialObject.class);
        }
    
        @Override
        public void serialize(SpecialObject value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeStartObject();
            gen.writeStringField("fieldChanged", value.getField());
            gen.writeStringField("anotherFieldChanged", value.getAnotherField());
            gen.writeEndObject();
        }
    }
    

    没什么花哨的,只是在序列化时更改字段名称。

    现在您需要在Module 中添加您的序列化程序,并在对象映射器中注册该模块。你可以这样做:

    public class NoAnnot {
    
        public static void main(String[] args) throws Exception {
            ObjectMapper objectMapper = new ObjectMapper();
            SimpleModule module = new SimpleModule();
            //add serializer in module
            module.addSerializer(SpecialObject.class, new SpecialObjectSerializer());
            //register module
            objectMapper.registerModule(module);
            objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
            
            SpecialObject specialObject = new SpecialObject();
            specialObject.setField("foo");
            specialObject.setAnotherField("bar");
            WrapperObject wrapperObject = new WrapperObject();
            wrapperObject.setText("bla");
            wrapperObject.setSpecialObject(specialObject);
            String json = objectMapper.writeValueAsString(wrapperObject);
            System.out.println(json);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2023-03-30
      • 2018-11-17
      • 2020-07-26
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      相关资源
      最近更新 更多