使用自定义构造函数将JsonNode转换为POJO

时间:2015-03-13 06:59:01

标签: java json playframework jackson

Convert JsonNode into POJO相似 和Converting JsonNode to java array,但无法找到问题的确切解决方案。

这是我的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?)

显然,如果我在Building类中删除我的构造函数并为我的字段类型添加一个setter,它就可以了。但是如果我确实要求强制我避免使用setter等,那么必须使用构造函数来初始化类型值吗?我怎样才能轻松地将json绑定/转换为建筑物列表?

我也尝试了以下但没有成功:

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

1 个答案:

答案 0 :(得分:2)

错误消息说明了一切,您的Building类没有默认构造函数,因此Jackson无法创建它的实例。

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;
    }   
}