Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用父属性值对jackson进行多态反序列化_Java_Json_Jackson_Jackson Databind_Jackson2 - Fatal编程技术网

Java 使用父属性值对jackson进行多态反序列化

Java 使用父属性值对jackson进行多态反序列化,java,json,jackson,jackson-databind,jackson2,Java,Json,Jackson,Jackson Databind,Jackson2,我有一个json,如下所示: { "transformationRules": [ { "targetFieldName": "pageUrlNumber", "inputPath": "$.metadata.pageUrl", "rules": [

我有一个json,如下所示:

{
    "transformationRules": [
        {
            "targetFieldName": "pageUrlNumber",
            "inputPath": "$.metadata.pageUrl",
            "rules": [
                {
                    "name": "regex",
                    "regexPattern": "\\d+",
                    "regexTransformType": "extract",
                    "order":2
                }
            ]
        },
        {
            "targetFieldName": "categories",
            "inputPath": "$.attributes[0].productInfo.breadCrumbs",
            "rules": [
                {
                    "name": "transform"
                }
            ]
        }
    ]
}
规则
数组具有不同类的json

我希望根据名称的值(即regex,transform)将上述json转换为它们的POJO。我尝试了以下代码

Rule.java

@NoArgsConstructor
@Data
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
        property = "name")
@JsonSubTypes({
        @JsonSubTypes.Type(value = RegexRule.class, name = "regex"),
        @JsonSubTypes.Type(value = Transform.class, name = "transform"),
})
public abstract class Rule {

    @JsonProperty("name")
    private String name;

    @JsonProperty("order")
    private int order = 1;

    protected Rule(String name, int order) {
        this.name = name;
        this.order = order;
    }

}
RegexRule.java

@NoArgsConstructor
@Data
public class RegexRule extends Rule{

    @JsonProperty("regexPattern")
    private String regexPattern;

    @JsonProperty("regexTransformType")
    private String regexTransformType;

    @JsonProperty("replacementValue")
    private String replacementValue = "";

    @JsonProperty("regexGroupNumber")
    private int regexGroupNumber = 0;

    public RegexRule(String name, int order, String regexPattern, String regexTransformType, String replacementValue, int regexGroupNumber) {
        super(name, order);
        this.regexGroupNumber = regexGroupNumber;
        this.regexPattern = regexPattern;
        this.regexTransformType = regexTransformType;
        this.replacementValue = replacementValue;
    }
}
Transform.java

@NoArgsConstructor
@Data
public class Transform extends Rule{

    public Transform(String name, int order) {
        super(name, order);
    }
}
Main.java

for(TransformationRule transformationRule: getTransformationRules()){
            for(Rule rule:transformationRule.getRules()){
                System.out.println(rule.getName());
            }
        }
输出:

null
null
在我的主函数中,当我将json反序列化到POJO时,我得到的名称为null。相反,我应该将
regex
transform
作为输出

我在这里犯了什么错误?我需要一个工厂方法的名称

在这里听起来是错误的,我很惊讶如果它真的起作用,那就意味着:

{
  "name": "regex", // This is the *external* property, one level up
  { // this is the Rule
    "order": 2,
    ...
  }
}
试一试

  • As.PROPERTY
    • 您可以从POJO中删除
      Rule#name
      ,因为它被视为只有Jackson才能正确反序列化的元数据。记住
      rule.getName()=“regex”
      与RegexRule的
      规则实例相同
  • As.现有财产
    • 将按照您的预期填充字段,但在规模上可能会有稍差的性能(仅当应用程序持续执行此操作时才有关系)
    • 有关另一个示例,请参见

你救了我一天。非常感谢。