杰克逊使两个json属性的一个java属性
我有一个舒适的问题,在休息api中使用杰克逊。 我使用杰克逊序列化有任何类型的属性,像java.time对象:杰克逊使两个json属性的一个java属性
public class DomainObject{
public LocalDateTime start;
}
我可以用杰克逊制作这样的事情:
{
start: '2017-12-31 17:35:22'
}
,我可以用它来产生这样的事情:
{
start: 102394580192345 //milliseconds
}
但我想有两个,在JS来workwith毫秒和字符串表示谁使用REST的API纯粹机智用户hout js-front。 (主要是我,用于调试)
所以有什么办法,让杰克逊产生以下?
{
start: 102394580192345 //milliseconds
startString: '2017-12-31 17:35:22'
}
你可以编写一个自定义的Jackson串行器,然后必须在应用程序中注册。之后,每个这种dataType的出现都会以这种方式进行序列化。即使要序列化的数据类型在另一个数据类型中。 (就像你的例子)
注意:我没有为LocalDateTime编写它,因为我在我的应用程序中为ZonedDateTime编写它。根据您的需求重写它应该不是一件难事。
public class ZonedDateTimeSerializer extends JsonSerializer<ZonedDateTime>
{
@Override
public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException
{
gen.writeStartObject();
gen.writeFieldName("timestamp");
gen.writeString(Long.toString(value.toInstant().toEpochMilli()));
gen.writeFieldName("offset");
gen.writeString(value.getOffset().toString());
gen.writeFieldName("zone");
gen.writeString(value.getZone().toString());
gen.writeFieldName("ts");
gen.writeString(StringUtils.convertZonedDateTimeToISO8601String(value));
gen.writeEndObject();
}
}
然后将其注册为杰克逊的ObjectMapper这样的:
objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule("MyModule");
module.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer());
objectMapper.registerModule(module);
虽然在这个过程中,我建议建立一个生产者(CDI),将始终与这串返回objectMapper默认添加。但我会离开这个任务你来研究;)
一个简单的办法是自己做字符串转换为一个额外的JSON字段:
public class DomainObject {
private LocalDateTime start;
@JsonProperty("startString")
public String formatStartDate() {
// use a date formatter to format the date as string here
}
}
杰克逊将序列start
正常,和你已添加额外的JSON字段startString
我想指出,未来的读者,这种解决方案也很好。然而,只有当你知道你只需要该用例一次并且只在该位置时才是首选。如果你知道你需要在多个地方或一般的自定义序列化,自定义杰克逊串行器是首选的选项。 _in我的观点_ 仍然是您的解决方案+1。 – Nico
听起来完全像我所需要的,明天我会试试。 thx –