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

Spring JSON converter. How to bind different types

我有一个 ajax 呼叫,数据为:“{"timeLeft": 12:33, "cheked": true}”。在客户端 timeleft 格式:HH:MM,但在服务器端我们需要将其转换为毫秒(Long)。如何使用 MappingJackson2HttpMessageConverter 做到这一点? 在 Spring 提交表单后,我们可以使用 PropertyEditors。 Jackson Converters 中的 json 数据是否有类似内容?谢谢

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

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

如果预期时间值确实是 "HH:MM" 其中 "HH" 实际上意味着 "Hour of Day (0-23)" 而 "MM" 意味着 "Minute of Hour (0-59)" 然后可以使用以下方法.

向支持 POJO 添加自定义 @JsonCreator

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" 是月,而不是分钟)。