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;