2015-03-13 92 views
0

Convert JsonNode into POJOConverting JsonNode to java array類似,但無法找到解決我的問題的確切解決方案。使用自定義構造函數將JsonNode轉換爲POJO

這裏是我的POJO聲明:

public class Building implements Serializable { 

    private BuildingTypes type; 

    public Building(BuildingTypes type) { 
     this.type = type; 
    } 

    public BuildingTypes getType() { 
     return type; 
    } 
} 

public enum BuildingTypes { 
    TRIPLEX, DUPLEX, HOUSE 
} 

所以在我的測試中,我希望得到的建築列表和轉換/ JSON的列表綁定到實物建築的列表。

這裏就是我想要做的事:

Result result = applicationController.listLatestRecords(); 
String json = contentAsString(result); 
JsonNode jsonNode = Json.parse(json); 

List<Building> buildings = new ArrayList<>(); 

buildings.add(mapper.treeToValue(jsonNode.get(0), Building.class)); 

不過,我得到以下錯誤:

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class domain.building.Building]: can not instantiate from JSON object (need to add/enable type information?) 

顯然,如果我刪除我的構造建築類並添加二傳手對我的字段類型,它的工作原理。但是,如果我確實有一個要求強迫我避免使用setter,那麼必須使用構造函數來初始化類型值?我怎樣才能輕鬆地綁定/轉換json到建築物清單?

我也試過以下,但沒有成功:

List<Building> buildings = mapper.readValue(contentAsString(result), 
      new TypeReference<List<Building>>() {}); 

回答

2

錯誤消息說,這一切,你Building類沒有默認的構造函數,因此傑克遜是無法創建它的一個實例。

Building

public class Building implements Serializable { 
    private BuildingTypes type; 

    public Building(BuildingTypes type) { 
     this.type = type; 
    } 

    // Added Constructor 
    public Building() { 
    } 

    public BuildingTypes getType() { 
     return type; 
    } 
} 
+0

大壩,我覺得愚蠢的,但你說的沒錯添加默認的構造函數。它修復了我的問題,即使感覺不對,只是爲了測試而添加一個像這樣的默認空構造函數是錯誤的。因爲它是私人的,所以我很驚訝地發現類型集的價值。但我確實記得在傑克遜的文檔中他們說它適用於私人/受保護的領域。 – Jeep87c 2015-03-13 07:08:11

+0

好奇心,沒有其他的替代解決方案可以避免添加這個空的「無用的」空構造函數? – Jeep87c 2015-03-13 07:08:58

+1

需要一個空的構造函數來通過反射來創建一個新的實例。 – 2015-03-13 07:14:43