gpt4 book ai didi

java - 使用 Jackson 为多态类反序列化 JSON

转载 作者:行者123 更新时间:2023-11-30 12:01:51 25 4
gpt4 key购买 nike

我正在尝试反序列化 JSON,它可以是 GroupRule 或 AttributeRule:

AbstractRule
GroupRule
AttributeRule

我希望我的模型/实体/POJO 是通用的,因为我也在其他项目中使用 Snakeyaml 或其他序列化提供程序的相同类。

话虽如此,我偶然发现了这个:https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

在文章中,它表明我可以做到:

{ // Using fully-qualified path
"@class" : "com.fasterxml.beans.EmployeeImpl", ...
}

但是,当我这样做时,我得到:

Cannot construct instance of `com.walterjwhite.email.organization.api.configuration.rule.AbstractRule` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
at [Source: (FileInputStream); line: 4, column: 10] (through reference chain: com.walterjwhite.email.organization.api.configuration.rule.EmailMatcherRule["rule"])
com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)

我的配置是这样的:

 {
"name": "default",
"ordering": "1",
"rule": {
"@class": "com.walterjwhite.email.organization.api.configuration.rule.GroupRule",
"criteriaType": "Should",
"rules": [
{"@class": "com.walterjwhite.email.organization.api.configuration.rule.AttributeRule",
"emailMessageField": "Subject",
"values": ["default"]
}
]
},
"matchType": "ContainsIgnoreCase",
"actionClassNames": [
"com.walterjwhite.email.organization.plugins.count.CountAction",
"com.walterjwhite.email.organization.plugins.index.IndexAction",
"com.walterjwhite.email.organization.plugins.reply.MoveAction"
]
}

在 Java 方面,我通常这样做:

mapper.readValue(inputStream, entityType);

现在,本例中的 entityType 是 EmailMatcherRule,它内部有一个规则字段,可以是属性或组。 Inputstream 就是我传入的 fileInputStream ...

我正在使用 Jackson 2.10.1。我还从 YAML 转换了上面的 JSON,它通过 Snakeyaml 工作正常。请注意,它会自动将类嵌入到 YAML 中,因此这不是问题。

我的 JSON 是否正确 - 根据文档,我应该能够添加 @class 属性来指定我想使用的类,对吗?

最佳答案

我在下面进行了尝试,它在没有任何配置的情况下工作。不确定这是否是您想要实现的目标:

public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
String groupRuleStr = "{\"parentId\":\"parent\",\"groupId\":\"group\"}";
String attributeRuleStr = "{\"parentId\":\"parent\",\"attributeId\":\"attribute\"}";

GroupRule groupRule = mapper.readValue(groupRuleStr, GroupRule.class);
AttributeRule attributeRule = mapper.readValue(attributeRuleStr, AttributeRule.class);

System.out.println(groupRule.groupId);
System.out.println(attributeRule.attributeId);

}

static abstract class AbstractRule {
public String parentId = "parent";
}

static class GroupRule extends AbstractRule {
public String groupId = "group";
}

static class AttributeRule extends AbstractRule {
public String attributeId = "attribute";
}

关于java - 使用 Jackson 为多态类反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206259/

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