使用自定义构造函数将 JsonNode 转换为 POJO
Convert JsonNode to POJO with custom constructor
类似于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
}
所以在我的测试中,我想得到一个建筑物列表,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;
}
}
类似于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
}
所以在我的测试中,我想得到一个建筑物列表,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;
}
}