有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    为了让empJoiningDate字段根据employeeType的格式进行序列化,您需要为EmployeePOJO类型而不是Date字段创建一个自定义Serializer

    按照这种方法,您将可以访问所有对象字段,并可以提供条件日期序列化逻辑

    {}实现如下:

    private static class EmployeeSerializer extends StdSerializer<Employee> {
    
        private static final String TYPE_ONE = "SomeType";
    
        private static final String TYPE_TWO = "SomeOtherType";
    
        private SimpleDateFormat sampleFormatOne = /** format initialized **/;
    
        private SimpleDateFormat sampelFormatTwo = /** format initialized **/;
    
        protected EmployeeSerializer() {
            super(Employee.class);
        }
    
        @Override
        public void serialize(Employee employee, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeStartObject();
            jsonGenerator.writeString(employee.getEmployeeType());
            switch (employee.getEmployeeType()) {
                case TYPE_ONE: jsonGenerator.writeString(sampleFormatOne.format(employee.getEmpJoiningDate()));
                case TYPE_TWO: jsonGenerator.writeString(sampelFormatTwo.format(employee.getEmpJoiningDate()));
            }
            jsonGenerator.writeEndObject();
        }
    }
    

    然后,需要使用自定义序列化程序而不是实例日期字段来注释Employee值类:

    @JsonSerialize(using = EmployeeSerializer.class)
    public class Employee {
        //...
    }