Rest Json Jackson Mapper自定义对象映射器



我遇到了Jackson Json映射器的问题,我不知道如何解决。

我有一个Spring MVC Rest应用程序,端点使用Jackson转换为Json。

一些结果对象包含我想在转换之前篡改的类型。

更具体地说,结果对象可能是这样的:

ResultObject
    - getDoubleMap() : DoubleMap
        - getDoubleEntries() : List<DoubleEntry>
        - toMap() : Map<String, Double>

我想做的不是让Jackson转换DoubleMap实例而是重写它,像这样

Object someJacksonMapInterceptor(Object object) {
    if(object instanceof DoubleMap) {
        return ((DoubleMap) object).toMap();
    }
    return object;
}

我已经折磨谷歌很长一段时间了,没有一个简单的解决方案。希望有人能指点一下。

提前感谢。

在一个应用程序中,我们是自定义反序列化日期,也许你可以使用它来自定义反序列化。

public class VitalSign {
    public static final String DATE_FORMAT1 = "yyyy-MM-dd'T'HH:mm:ssZ";
    public static final String DATE_FORMAT2 = "yyyy-MM-dd'T'HH:mm:ss";
    //public static final String DATE_FORMAT3 = "yyyy-MM-dd'T'HH:mm:ssTDZ";
    public static final String DATE_FORMAT4 = "MMM dd, yyyy h:mm:ss aa";

    @NotNull
    @Column(name = "observed")
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "M-")
    @JsonDeserialize(using = CustomJsonDateDeserializer.class)
    private Date timestamp;

    public static class CustomJsonDateDeserializer extends JsonDeserializer<Date> {

        public CustomJsonDateDeserializer() {
            super();            
        }
        @Override
        public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
            SimpleDateFormat[] formats = { new SimpleDateFormat(DATE_FORMAT1), new SimpleDateFormat(DATE_FORMAT2), new SimpleDateFormat(DATE_FORMAT4, Locale.US) };
            String date = jsonparser.getText();
            for (SimpleDateFormat format : formats) {
                try {
                    return format.parse(date);
                } catch (ParseException e) {
                }               
            }
            throw new RuntimeException("Unparseable date " + date);
        }
    }
}

对于序列化,您可以用@JsonValue注释您的toMap()方法。对于反序列化,如果您有一个静态工厂要从Map<String, Double>创建DoubleMap,则只需用@JsonCreator注释它。

private final ObjectMapper mapper = new ObjectMapper();
@Test
public void serialize_doublemap() throws Exception {
    DoubleMap map = new DoubleMap();
    map.put("red", 0.5);
    map.put("orange", 0.7);
    assertThat(mapper.writeValueAsString(map), equivalentTo("{ red: 0.5, orange: 0.7 }"));
}
@Test
public void deserialize_doublemap() throws Exception {
    assertThat(mapper.readValue("{ "red": 0.5, "orange": 0.7 }", DoubleMap.class).toMap(),
            equalTo(ImmutableMap.of("red", 0.5, "orange", 0.7)));
}
public static class DoubleMap {
    public List<DoubleEntry> entries = new ArrayList<>();
    public void put(String label, double value) {
        entries.add(new DoubleEntry(label, value));
    }
    @JsonCreator
    public static DoubleMap fromJson(Map<String, Double> input) {
        DoubleMap map = new DoubleMap();
        input.forEach(map::put);
        return map;
    }
    public List<DoubleEntry> getDoubleEntries() {
        return entries;
    }
    @JsonValue
    public Map<String, Double> toMap() {
        return entries.stream().collect(Collectors.toMap(e -> e.label, e -> e.value));
    }
}
public static final class DoubleEntry {
    public final String label;
    public final double value;
    public DoubleEntry(String label, double value) {
        this.label = label;
        this.value = value;
    }
}

最新更新