2017-07-19 41 views
1

我有一个舒适的问题,在休息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' 
} 

回答

2

你可以编写一个自定义的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默认添加。但我会离开这个任务你来研究;)

+1

听起来完全像我所需要的,明天我会试试。 thx –

2

一个简单的办法是自己做字符串转换为一个额外的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

+1

我想指出,未来的读者,这种解决方案也很好。然而,只有当你知道你只需要该用例一次并且只在该位置时才是首选。如果你知道你需要在多个地方或一般的自定义序列化,自定义杰克逊串行器是首选的选项。 _in我的观点_ 仍然是您的解决方案+1。 – Nico

相关问题