Skip to content

Jackson 自定义序列化、反序列化方法

🏷️ Jackson

下面的示例代码是序列化日期类型为.net 日期类型默认反序列化支持的格式。

DotNetDateSerializer 反序列化类

自定义一个帮助函数,指定所有日期类型统一使用该序列化方法。

java
package com.octopus.soa.common.helper;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

import java.io.IOException;
import java.util.Date;

/**
* Created by liujiajia on 2017/12/15.
*/
public class DotNetDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString("/Date(" + String.valueOf(date.getTime()) + "-0000)/");
}
}

通过继承 JsonDeserializer类 自定义反序列化类。

自定义序列化类的使用

java
package com.octopus.soa.common.helper;

import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;

import java.io.IOException;
import java.util.Date;

/**
 * Created by liujiajia on 2017/12/26.
 */
public class JsonHelper {

    public static String toJson(Object obj) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(obj);
    }

    public static String toDotNetJson(Object obj) throws IOException {
        ObjectMapper mapper = new ObjectMapper();

        SimpleModule dotNetModule = new SimpleModule("DotNetModule", new Version(1, 0, 0, null));
        dotNetModule.addSerializer(Date.class, new DotNetDateSerializer());
        mapper.registerModule(dotNetModule);

        return mapper.writeValueAsString(obj);
    }
}

反序列化可以通过 SimpleModule.addDeserializer 方法指定反序列化类。

也可以对单个字段指定序列化、反序列化方法

java
@JsonSerialize(using = DotNetDateSerializer.class)
private Date flightDate;

反序列化可以使用 @JsonDeserialize 注解实现。

参考