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

Convert JsonNode to POJO with custom constructor

类似于Convert JsonNode into POJOConverting 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
}

所以在我的测试中,我想得到一个建筑物列表,convert/bind 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 class 中删除我的构造函数并为我的字段类型添加一个 setter,它就可以工作。但是如果我确实有一个要求迫使我避免使用 setter 等等,必须使用构造函数来初始化类型值?我怎样才能bind/convert json 轻易地得到一个建筑列表?

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

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

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

Building Class

中添加默认构造函数
public class Building implements Serializable {
    private BuildingTypes type;

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

    // Added Constructor 
    public Building() {
    }

    public BuildingTypes getType() {
        return type;
    }   
}