gpt4 book ai didi

java - 使用 Jackson 序列化 Typed 集合时出错

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:38 25 4
gpt4 key购买 nike

我正在尝试使用混合序列化一个集合,但 Jackson 不会保存类型信息。这是一个基本测试,说明会发生什么:

public class CollectionSerializationTest {

interface Common extends Serializable {

}

class A implements Common {
private static final long serialVersionUID = 1L;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = A.class, name = "CODE") })
class AMixIn {

}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = B.class, name = "CODE") })
class BMixIn {

}

class B implements Common {
private static final long serialVersionUID = 1L;
}

@Test
public void test() throws JsonGenerationException, JsonMappingException,
IOException {
ObjectMapper om = new ObjectMapper();
List<Common> list = new ArrayList<Common>();
A a = new A();
B b = new B();
list.add(a);
list.add(b);
om.getSerializationConfig().addMixInAnnotations(A.class, AMixIn.class);
om.getSerializationConfig().addMixInAnnotations(B.class, BMixIn.class);
System.out.println(om.writeValueAsString(list)); // Outputs [{},{}]
System.out.println(om.writeValueAsString(a));// Outputs {"type":"CODE"}
}

}

如何在第一个输出上实现输出 [{"type":"CODE"},{"type":"CODE"}]

最佳答案

我不确定这是否是最简单的解决方案,但我认为您可以这样做:

  1. 创建新的 List 实现
  2. 为新类型编写序列化程序
  3. 在您的 POJO 类中使用此类型

扩展 ArrayList 的新 Java 类:

@JsonSerialize(using = JacksonListSerializer.class)
class JacksonList<E> extends ArrayList<E> {

private static final long serialVersionUID = 1L;
}

上面类的序列化器:

class JacksonListSerializer extends JsonSerializer<JacksonList<?>> {

@Override
public void serialize(JacksonList<?> list, JsonGenerator generator, SerializerProvider provider)
throws IOException, JsonProcessingException {
generator.writeStartArray();
if (list != null) {
for (Object item : list) {
generator.writeObject(item);
}
}
generator.writeEndArray();
}
}

现在,您可以在示例中使用此列表:

public static void main(String[] args) throws IOException {
ObjectMapper om = new ObjectMapper();
List<Common> list = new JacksonList<Common>();
list.add(new A());
list.add(new B());
om.addMixInAnnotations(A.class, AMixIn.class);
om.addMixInAnnotations(B.class, BMixIn.class);
System.out.println(om.writeValueAsString(list));
System.out.println(om.writeValueAsString(new A()));
}

上面的例子打印:

[{"type":"CODE"},{"type":"CODE"}]
{"type":"CODE"}

关于java - 使用 Jackson 序列化 Typed 集合时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22103451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com