Java 在下面的场景中,如何为模型的特定字段选择自定义Serializer
以下是两个自定义日期序列化程序:Java 在下面的场景中,如何为模型的特定字段选择自定义Serializer,java,json,spring,annotations,jackson,Java,Json,Spring,Annotations,Jackson,以下是两个自定义日期序列化程序: 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.jack
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));
}
}
为了使empJoiningDate字段根据employeeType的格式进行序列化,您需要为员工
POJO类型而不是日期
字段创建自定义的序列化程序
按照这种方法,您将可以访问所有对象字段,并可以提供条件日期序列化逻辑
序列化程序
实现如下:
私有静态类EmployeeSerializer扩展了StdSerializer{
私有静态最终字符串类型\u ONE=“SomeType”;
私有静态最终字符串类型\u TWO=“SomeOtherType”;
私有SimpleDataFormat sampleFormatOne=/**格式已初始化**/;
私有SimpleDataFormat sampelFormatTwo=/**格式已初始化**/;
受保护的EmployeeSerializer(){
super(Employee.class);
}
@凌驾
public void serialize(Employee-Employee、JsonGenerator、JsonGenerator、SerializerProvider-SerializerProvider)引发IOException{
jsongGenerator.writeStartObject();
jsonGenerator.writeString(employee.getEmployeeType());
开关(employee.getEmployeeType()){
案例类型一:jsonGenerator.writeString(sampleFormatOne.format(employee.getEmpJoiningDate());
案例类型二:jsonGenerator.writeString(sampelFormatTwo.format(employee.getEmpJoiningDate());
}
jsongGenerator.writeEndObject();
}
}
然后,您需要使用自定义序列化程序(而不是实例日期字段)注释Employee
值类:
@JsonSerialize(使用=EmployeeSerializer.class)
公营雇员{
//...
}
感谢您的输入,让我尝试一下,现在有一个问题,我应该将注释“@JsonSerialize(using=EmployeeSerializer.class)”放在哪里?用课堂代替场地?感谢@tmarwenHey Sanyam提供的信息,因为您已经猜到它应该是应该注释的Employee类。我已经相应地更新了答案,以提供完整的配置说明。如果答案符合您的需要,请毫不犹豫地接受并更新投票。嘿,这很好,非常感谢:)如果您喜欢我的问题,也可以更新投票,但这会将所有值修改为相同的日期值、员工类型、员工日期:(@tmarwenHow所有的值都是一样的吗?你能用你已经尝试过的更新帖子吗?
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));
}
}
<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>
private field String employeeType;
@JsonProperty("empJoiningDate")
@JsonSerialize(using=DateFormatter.class)
private Date empJoiningDate = null;