org.apache.commons.lang3.tuple.MutablePair 扩展了Pair,实现了Map.Entry 接口。 Map.Entry 默认被Jackson 视为Map 对象,该对象被序列化为JSON 作为key-value 结构。要像经典的POJO 一样序列化它,我们需要实现自定义序列化器,它将定义正确的结构:
class MutablePairJsonSerializer extends JsonSerializer<MutablePair> {
@Override
public void serialize(MutablePair value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeObjectField("left", value.getLeft());
gen.writeObjectField("right", value.getRight());
gen.writeEndObject();
}
}
使用上述序列化程序的简单应用:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.apache.commons.lang3.tuple.MutablePair;
import java.io.IOException;
public class JsonApp {
public static void main(String[] args) throws Exception {
MutablePair<String, String> pair = new MutablePair<>();
pair.setLeft("leftV");
pair.setRight("rightV");
SimpleModule pairModule = new SimpleModule();
pairModule.addSerializer(MutablePair.class, new MutablePairJsonSerializer());
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(pairModule);
String json = mapper.writeValueAsString(pair);
System.out.println(json);
System.out.println(mapper.readValue(json, MutablePair.class));
}
}
打印:
{
"left" : "leftV",
"right" : "rightV"
}
(leftV,rightV)
这表明对象已使用键序列化并正确反序列化为对象。
如果我们想保持默认的序列化过程,我们需要自定义反序列化器,如下所示:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.apache.commons.lang3.tuple.MutablePair;
import java.io.IOException;
public class JsonApp {
public static void main(String[] args) throws Exception {
MutablePair<String, String> pair = new MutablePair<>();
pair.setLeft("leftV");
pair.setRight("rightV");
SimpleModule pairModule = new SimpleModule();
pairModule.addDeserializer(MutablePair.class, new MutablePairJsonDeserializer());
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(pairModule);
String json = mapper.writeValueAsString(pair);
System.out.println(json);
System.out.println(mapper.readValue(json, MutablePair.class));
}
}
class MutablePairJsonDeserializer extends JsonDeserializer<MutablePair> {
@Override
public MutablePair deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
p.nextToken(); // SKIP START_OBJECT
String keyName = p.getCurrentName();
p.nextToken();
return MutablePair.of(keyName, p.getValueAsString());
}
}