gpt4 book ai didi

java - 如何使用 jackson 将自定义解串器添加到接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:11 24 4
gpt4 key购买 nike

说我有一个接口(interface) A,我想为所有实现接口(interface) A 的类使用自定义反序列化器,所以我使用下面的代码但它不起作用,而 CustomAserializer 有效。那么我应该怎么做才能使用我的自定义反序列化器反序列化所有实现 A 的类。谢谢。

module.addDeserializer(A.class, new CustomADeserializer());
module.addSerializer(A.class, new CustomASerializer())

最佳答案

您似乎忘记使用 @JsonDeserialize(using = ImplementationClazz.class) 注释您的实现类,以指示该类应该用于反序列化抽象类或接口(interface)。

以下是使用 Jackson 反序列化具有多个实现的接口(interface)的简单示例。

这是我的界面:

@JsonDeserialize(using = UserDeserializer.class)
public interface User {
}

接口(interface)的一个实现:

@JsonDeserialize(as = ServiceUser.class)
public class ServiceUser implements User{

private String name;
private String role;

//constructor, setters & getters

第二次实现:

@JsonDeserialize(as = AdminUser.class)
public class AdminUser implements User {

private String role;
private String designation;

//constructor, setters & getters

这是反序列化器:

public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jp, DeserializationContext context) throws IOException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = mapper.readTree(jp);

/*write your own condition*/
if (root.has("name") && root.get("name").asText().equals("XYZ")) {
return mapper.readValue(root.toString(), ServiceUser.class);
}
return mapper.readValue(root.toString(), AdminUser.class);
}
}

如果您不注释实现类,您可能会得到 StackOverflowError。所有实现类都应该反序列化自己,否则它将使用父类中的反序列化器,从而导致 StackOverflowError。

关于java - 如何使用 jackson 将自定义解串器添加到接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387978/

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