Spring JSON转换器。如何绑定不同的类型

时间:2015-02-10 08:04:15

标签: java json spring spring-mvc jackson

我有一个带数据的ajax调用:" {" timeLeft":12:33," cheked":true}"。在clienside timeleft格式:HH:MM,但在服务器端我们需要将其转换为毫秒(长)。如何使用MappingJackson2HttpMessageConverter? 在提交表单后的Spring中,我们可以使用PropertyEditors。杰克逊转换器中的json数据有类似之处吗?感谢

2 个答案:

答案 0 :(得分:1)

MappingJackson2HttpMessageConverter使用Jackson的ObjectMapper从JSON反序列化为Pojos(或从JSON反序列化到Maps / JsonNodes)。因此,一种方法是创建一个作为反序列化对象的POJO。

如果预期的时间值是真的" HH:MM"在哪里" HH"实际上意味着一个小时(0-23)"和" MM"表示"小时(0-59)"然后可以使用以下方法。

将自定义@JsonCreator添加到您的支持POJO:

public class TimeLeftPojo {
    // The time pattern
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

    // The checked property
    private final boolean checked;

    // The parsed time
    private final LocalTime timeLeft;

    // A creator that takes the string "HH:mm" as arg
    @JsonCreator
    public static TimeLeftPojo of(
            @JsonProperty("timeLeft") String timeLeft, 
            @JsonProperty("checked") boolean checked) {

        return new TimeLeftPojo(
                LocalTime.parse(timeLeft, formatter), checked);
    }

    public TimeLeftPojo(final LocalTime timeLeft, final boolean checked) {
        this.timeLeft = timeLeft;
        this.checked = checked;
    }

    public LocalTime getTimeLeft() {
        return timeLeft;
    }

    public long toMillisecondOfDay() {
        return getTimeLeft().toSecondOfDay() *  1000;
    }

    public boolean isChecked() {
        return checked;
    }
}

然后反序列化开箱即用:

ObjectMapper mapper = new ObjectMapper();

// Changed the spelling from "cheked" to "checked"
String json = "{\"timeLeft\": \"10:00\", \"checked\": true}";
final TimeLeftPojo timeLeftPojo = mapper.readValue(json, TimeLeftPojo.class);
System.out.println(timeLeftPojo.toMillisecondOfDay());

输出将是:

  

36000000

@JsonCreator的JavaDoc可以be found here

请注意,时间模式为" HH:mm",而不是" HH:MM"与在原始查询中一样(" M"是月份,而不是分钟)。

答案 1 :(得分:0)

你在服务器端有没有映射这个json的对象?也许你可以为这个字段使用JsonSerializer / JsonDeserializer的实现,并将时间转换为时间戳。