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