2017-09-25 240 views
0

我需要使用Jackson將JSON字符串反序列化爲不同對象類型的列表,具體取決於在其中一個字段中設置的值。我想知道創建不同列表類型的最佳方法,以及我如何實現這一點?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; 
} 

UPDATE:

@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

有兩種變體,您可以使用:

後通過以下層次結構我更新了我的POJO的

  1. 創建自定義解串器。在這裏看到完整的說明和示例http://www.baeldung.com/jackson-deserialization
  2. 最好的方法是使用一個基類和兩個孩子。每個孩子應該標記爲@DiscriminatorValue。看到這裏的完整描述和例子http://www.baeldung.com/jackson-inheritance
+0

謝謝奧列格,我將檢查出的選項,看看我能實現一個 – Orby

+0

奧列格,如果我實現一個自定義解串器做我需要檢查我的屬性被稱爲「操作類型「在被覆蓋的反序列化方法中並在那裏返回適當的List Type? – Orby

+0

是的。在你的反序列化器中,你可以訪問json部分。首先,您必須讀取* key字段*,然後使用特定數據構造一個對象,或者創建依賴於它的Dirrefernt對象。這是非常強大的功能,但我強烈建議查看'@ DiscriminatorValue'。 –

相關問題