Java 使jackson序列化apachecommons对
如果可能的话,我如何让jackson以正确的方式序列化我的左对象和右对象,而不使用我自己的复杂序列化程序Java 使jackson序列化apachecommons对,java,json,jackson,apache-commons,Java,Json,Jackson,Apache Commons,如果可能的话,我如何让jackson以正确的方式序列化我的左对象和右对象,而不使用我自己的复杂序列化程序org.apache.commons.lang3.tuple.Pair。例如,我必须编写以下代码: public class MyPairTest { public static void main(String[] args) { Address address1 = new Address("Axel Street 1", "London");
org.apache.commons.lang3.tuple.Pair
。例如,我必须编写以下代码:
public class MyPairTest {
public static void main(String[] args) {
Address address1 = new Address("Axel Street 1", "London");
Address address2 = new Address("Axel Street 2", "Copenhagen");
Map<String, Pair> map = new HashMap<>();
map.put("Address", Pair.of(address1, address2));
Pair p = Pair.of(address1, address2);
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
try {
String serializeMapWithPair = mapper.writeValueAsString(map);
String serializePair = mapper.writeValueAsString(p);
System.out.println(serializeMapWithPair);
System.out.println(serializePair);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Gson gson = new Gson();
System.out.println(gson.toJson(p));
}
}
因此,前两个输出是使用jackson ObjectMapper序列化
Pair
,其中最后一个是使用Gson,我希望实现Gson示例中的结果,但是使用jackson,不使用左
和右
部分。我从中得到的Gson
示例,我知道他们声明了以下“Commons lang没有依赖项,因此不能使用Jackson或任何类似的东西。”
,但我想知道Jackson自己是否制作了一个序列化器或类似的序列化器,在那里找不到类似的东西,所以也许杰克逊没有简单的解决办法?或者我应该放弃它并使用Gson,然后手动操作并删除左
和右
部分吗?无论如何,我想我只需要使用before和after字段实现我自己的泛型类,然后序列化它,即使最终我希望它是这样,因此,我以下面的课程结束:
public class MyPair<T> {
private T before;
private T after;
private MyPair(T before, T after) {
this.before = before;
this.after = after;
}
public static <T> MyPair<T> of(final T before, final T after) {
return new MyPair<>(before, after);
}
public T getBefore() {
return this.before;
}
public T getAfter() {
return this.after;
}
public void setBefore(T before) {
this.before = before;
}
public void setAfter(T after) {
this.after = after;
}
}
这正是我所期待的:)。只需确保使用相同的对象类型调用它,否则抛出编译时错误,这似乎不起作用,因为现在()的
可以使用两种不同的类型调用。要详细回答问题:
Jackson将对implements Map.Entry
视为Map的一项,并生成错误的输出
绕过的唯一方法是编写自己的对
类,该类从不实现映射项
接口。您可以编写自定义序列化程序:
private static final class PairSerializer extends JsonSerializer<Pair> {
@Override
public void serialize(Pair value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeObjectField("left", value.getLeft());
gen.writeObjectField("right", value.getRight());
gen.writeEndObject();
}
}
{
"Address" : {
"before" : {
"street" : "Axel Street 1",
"city" : "London"
},
"after" : {
"street" : "Axel Street 2",
"city" : "Copenhagen"
}
}
}
private static final class PairSerializer extends JsonSerializer<Pair> {
@Override
public void serialize(Pair value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeObjectField("left", value.getLeft());
gen.writeObjectField("right", value.getRight());
gen.writeEndObject();
}
}
mapper.registerModule(new SimpleModule().addSerializer(Pair.class, new PairSerializer()));