【问题标题】:Jackson custom annotation for custom value serialization用于自定义值序列化的 Jackson 自定义注解
【发布时间】:2017-09-06 14:45:03
【问题描述】:

我正在尝试创建会影响序列化值的自定义 jackson 注释。

意思:

class X {
@Unit("mm") int lenght;
 ...
}

现在序列化对象 X(10) 将导致:

{
  "lenght" : "10 mm"
}

我怎样才能做到这一点?

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:
    import com.fasterxml.jackson.core.JsonGenerationException;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.*;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import com.fasterxml.jackson.databind.ser.ContextualSerializer;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.IOException;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    // Create own annotation storing your unit value
    
    @Target({ ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    @interface Unit {
        String value();
    }
    
    // Create custom serializer checking @Unit annotation
    
    class UnitSerializer extends StdSerializer<Integer> implements ContextualSerializer {
    
        private String unit;
    
        public UnitSerializer() {
            super(Integer.class);
        }
    
        public UnitSerializer(String unit) {
            super(Integer.class);
            this.unit = unit;
        }
    
        @Override
        public void serialize(Integer value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
            jgen.writeString(String.format("%d %s", value, unit));
        }
    
        @Override
        public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
            String unit = null;
            Unit ann = null;
            if (property != null) {
                ann = property.getAnnotation(Unit.class);
            }
            if (ann != null) {
                unit = ann.value();
            }
            return new UnitSerializer(unit);
        }
    }
    
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    class X {
        @JsonSerialize(using = UnitSerializer.class)
        @Unit("mm")
        private int length;
    }
    
    public class Runner {
        public static void main(String[] args) throws JsonProcessingException {
    
            X x = new X(10);
            ObjectMapper objectMapper = new ObjectMapper();
            System.out.println(objectMapper.writeValueAsString(x));
        }
    }
    

    结果:

    {"length":"10 mm"}
    

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 2018-05-06
      • 2016-01-11
      • 1970-01-01
      • 2019-08-10
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多