繁体   English   中英

Jackson根据字符串值将JSON反序列化为不同类型的列表

[英]Jackson Deserialize JSON To List of Different Types Depending On String Value

我需要使用Jackson来将JSON字符串反序列化为不同对象类型的列表,具体取决于在其中一个字段中设置的值。 我想知道创建不同列表类型的最佳方法是什么,如何实现呢?

我的JSON看起来像这样:

{"test":
    {"conditions":[....],                   
     "consequence": {"actionType":"string", 
                     "action": ["value 1","value 2"]}                                               
    }       
}

因此,当上面解析时,将返回List<String>

{"test":
    {"conditions":[....],                   
     "consequence": {"actionType":"test", 
                     "action": ["test","test"]}                                             
    }       
}

并且上面将返回List<Test>

我的Pojo仅包含:

  @Data
public class Consequence {

    public Consequence(String actionType){
        this.actionType = actionType;       
    };

    @JsonProperty("ACTIONTYPE")
    private String actionType;

    @JsonProperty("ACTION")
    private List<????> action;
}

更新:

在我使用以下层次结构更新了POJO之后:

@Data
public abstract class BaseConsequence {

    public BaseConsequence(String actionType){
        this.actionType = actionType;       
    };

    @JsonProperty("ACTIONTYPE")
    private String actionType;

}

 @Data
@DiscriminatorValue(value = "CONCATENATE")
public class ConcatenateConsequence extends BaseConsequence {

    public ConcatenateConsequence(String actionType, List<String> concatenateValues) {
        super(actionType);
        this.concatenateValues = concatenateValues;
    }
    private List<String> concatenateValues;
}

@Data
@DiscriminatorValue(value = "test")
public class TestConsequence extends BaseConsequence {

    public TestConsequence(String actionType, List<Test> tests){
        super(actionType);
        this.tests = tests;
    }
    private List<Test> tests;
}

@Data
public class Test {

    public Test(){};

    public Test(List<Condition> conditions, BaseConsequence baseConsequence){
        this.conditions = conditions;
        this.baseConsequence = baseConsequence;     
    }

    @JsonProperty("CONDITIONS")
    private List<Condition> conditions;

    @JsonProperty("CONSEQUENCE")
    private BaseConsequence baseConsequence;

    @Override
    public boolean equals(Object o) {

        if (o == this) return true;

        if (!(o instanceof Test)) {
            return false;
        }        
        Test test = (Test) o;
        return Objects.equals(conditions, test.conditions) && Objects.equals(baseConsequence, test.baseConsequence);
    }

    @Override
    public int hashCode() {
        return Objects.hash(conditions, baseConsequence);
    }   
}

我收到以下错误:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: {"TEST":{"CONDITIONS":[{"KEY":"KEY1","VALUES":["FLOAT"],"OPERATOR":""}],"CONSEQUENCE":{"ACTIONTYPE" :{"CONCATENATE": ["VALUE1","VALUE2"]}}}}; line: 1, column: 9] (through reference chain: package.TestCase["TEST"])

您可以使用两种变体:

  1. 创建自定义解串器。 有关完整的描述和示例,请参见此处http://www.baeldung.com/jackson-deserialization
  2. 最好的方法是使用一个基类和两个孩子。 每个孩子都应标有@DiscriminatorValue 有关完整的描述和示例,请参见此处http://www.baeldung.com/jackson-inheritance

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM