休息Json Jackson Mapper自定义对象映射器

时间:2015-09-25 14:56:03

标签: spring rest model-view-controller jackson

我遇到了Jackson Json mapper的问题,我无法弄清楚如何解决。

我正在使用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;
}

我现在已经折磨了谷歌一段时间而不是一个简单的解决方案。希望有人可以提供建议。

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

在一个应用程序中,我们是自定义deserealizing日期,可能您可以将它用于自定义deserealization。

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);

        }

    }
}

答案 1 :(得分:0)

对于序列化,您只需使用toMap()@JsonValue方法添加注释即可。对于反序列化,如果您有一个静态工厂来从DoubleMap创建Map<String, Double>,则可以使用@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;
    }
}