gpt4 book ai didi

java - 在使用 Jackson 序列化类时添加类型信息,以便可以在不使用注释的情况下使用接口(interface)类型进行反序列化?

转载 作者:行者123 更新时间:2023-12-04 09:32:32 26 4
gpt4 key购买 nike

这个问题类似于 include class name in all objects serialized by jackson但我想默认配置它而不在每个类上使用注释。最好我想添加一个 field到序列化的json,如_class_type包含序列化类的类名(最好不是事件完全限定,但我可以接受)。我正在使用 jackson 2.11.1。
例如,假设我有这个接口(interface):

public interface MyInterface {}
和两个实现:
public class MyClass1 implements MyInterface {

private String something;

public String getSomething() {
return something;
}

public void setSomething(String something) {
this.something = something;
}
}
public class MyClass2 implements MyInterface {

private String somethingElse;

public String getSomethingElse() {
return somethingElse;
}

public void setSomethingElse(String somethingElse) {
this.somethingElse = somethingElse;
}
}
我希望能够序列化 MyClass1 的实例和 MyClass2这样我就可以将它们反序列化为 MyInterface (即在序列化时添加类型信息)。
我读过 documentation您应该能够配置 ObjectMapper像这样使它工作:
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder().build();
objectMapper.activateDefaultTyping(ptv); // default to using DefaultTyping.OBJECT_AND_NON_CONCRETE
但是当我尝试这个时:
ObjectMapper objectMapper = new ObjectMapper();
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder().build();
objectMapper.activateDefaultTyping(ptv); // default to using DefaultTyping.OBJECT_AND_NON_CONCRETE

MyClass1 myClass1 = new MyClass1();
myClass1.setSomething("something");

String json = objectMapper.writeValueAsString(myClass1);

MyInterface myInterface = objectMapper.readValue(json, MyInterface.class);
我得到这个异常(exception):
com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class org.something.MyInterface
at [Source: (String)"{"something":"something"}"; line: 1, column: 1]
如果我将配置更改为使用 ObjectMapper.DefaultTyping.EVERYTHING然后 jackson 实际上似乎将类型包装在一个数组中,但是在尝试反序列化时我仍然遇到异常:
ObjectMapper objectMapper = new ObjectMapper();
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder().build();
objectMapper.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.EVERYTHING);

MyClass1 myClass1 = new MyClass1();
myClass1.setSomething("something");

String json = objectMapper.writeValueAsString(myClass1);

MyInterface myInterface = objectMapper.readValue(json, MyInterface.class);
现在的异常(exception)是:
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'org.something.MyClass1' as a subtype of `org.something.MyInterface`: Configured `PolymorphicTypeValidator` (of type `com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator`) denied resolution
at [Source: (String)"["org.something.MyClass1",{"something":"something"}]"; line: 1, column: 53]
我该如何解决这个问题?

最佳答案

我实际上是通过配置 ObjectMapper 让它工作的。像这样:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(), ObjectMapper.DefaultTyping.EVERYTHING);
不确定这是否是惯用的方法。

关于java - 在使用 Jackson 序列化类时添加类型信息,以便可以在不使用注释的情况下使用接口(interface)类型进行反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62771128/

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