java如何在下面的场景中为模型的特定字段选择自定义Serializer
下面是两个自定义日期序列化程序:
package test;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class DateFormatter extends StdSerializer<Date> {
private SimpleDateFormat sampleFormatOne= new SimpleDateFormat("dd-MMM-yyyy");
public DateFormatter(Class<Date> t) {
super(t);
}
public DateFormatter() {
super(Date.class);
}
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException,
JsonGenerationException {
java.util.Date inputDate = new java.util.Date(date.getTime());
jsonGenerator.writeString(sampleFormatOne.format(inputDate));
}
}
还有另一个日期序列化程序:
package test;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class DateFormatterTwo extends StdSerializer<Date> {
private SimpleDateFormat samoelFormatTwo= new SimpleDateFormat("dd-mm-yyyy");y");
public DateFormatterTwo (Class<Date> t) {
super(t);
}
public DateFormatterTwo () {
super(Date.class);
}
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException,
JsonGenerationException {
java.util.Date inputDate = new java.util.Date(date.getTime());
jsonGenerator.writeString(samoelFormatTwo.format(inputDate));
}
}
Spring配置如下:
<beans:bean id="customDate"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<beans:property name="objectMapper">
<beans:bean
class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<beans:property name="serializers">
<beans:array>
<beans:bean class="test.DateFormatter" />
<beans:bean class="test.DateFormatterTwo" />
</beans:array>
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>
<beans:bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter" />
<beans:ref bean="customDate" />
</beans:list>
</beans:property>
</beans:bean>
现在我需要做的是创建一个JSON对象,它根据字段值employeeType的值,基于first or second formatter
对日期进行序列化
通过当前的实现,我可以生成具有固定第一格式的JSON如何在运行时基于另一个字段值选择序列化程序
以下是模型中的字段
private field String employeeType;
@JsonProperty("empJoiningDate")
@JsonSerialize(using=DateFormatter.class)
private Date empJoiningDate = null;
# 1 楼答案
为了让empJoiningDate字段根据employeeType的格式进行序列化,您需要为
Employee
POJO类型而不是Date
字段创建一个自定义Serializer
按照这种方法,您将可以访问所有对象字段,并可以提供条件日期序列化逻辑
{}实现如下:
然后,需要使用自定义序列化程序而不是实例日期字段来注释
Employee
值类: