[英]jackson deserialize unknown property name to custom entity
我正在尝试使用jackson反序列化yaml文件,该文件的工作方式类似于Json,因此为了方便起见,我将使用Json。
我的Json结构如下所示:
{
"version": "2",
"services": {
"app": {
"build": {
"context": "./",
"args": {}
},
"image": "imageName"
},
"results": {
"build": "./",
"image": "imageName"
}
}
}
我想使用杰克逊反序列化此方法,但是使用默认的ObjectMapper时却出现UnknownPropertyException。
这是我要反序列化的课程:
public class ServiceModel {
List<ContainerModel> containers;
public List<ContainerModel> getContainers() {
return containers;
}
public void setContainers(List<ContainerModel> containers) {
this.containers = containers;
}
}
我的容器模型如下所示:
public class ContainerModel {
@JsonProperty("build")
private String build;
@JsonProperty("args")
private List<String> args;
@JsonProperty("context")
private String context;
@JsonProperty("dockerfile")
private String dockerFile;
// Getters and Setters below
编辑:我在描述Json结构时是错误的。 请查看杰克逊将其映射到JsonNode时生成的更正的Json结构
在这里,应将应用程序和结果映射到ContainerModel
编辑
查看新的Json结构,ServiceModel类应如下所示:
public class ServiceModel {
private String version;
private Map<String, ContainerModel> containers;
// Other fields here...
public void setContainers(Map<String, ContainerModel> containers) {
this.containers = containers;
}
public Map<String, ContainerModel> getContainers() {
return containers;
}
public void setVersion(String version) {
this.version = version;
}
public String getVersion() {
return version;
}
// Other setters/getters here...
}
这样,您就可以从键(字符串)到ContainerModel的映射。
原始帖子
好吧,您的Json示例具有一个称为services
的属性,而您的类具有一个名为containers
的属性。 您不应该期望这些属性之间有自动映射。
要自动映射它们,请使用相同的属性名称。 如果您不想或不能,可以随时使用Jackson的批注@JsonProperty
。 此外,如果存在您不想映射的字段,则应实例化一个新的ObjectMapper,并将其配置为忽略未知字段。 像这样:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
另外,我假设您获得映射ServiceModel类的异常,而不是//Known data structure
。 但是无论如何,我的建议都应该解决这两种情况。
似乎您正在尝试反序列化不存在的属性。
默认情况下,当您尝试反序列化未知属性时,Jackson将引发异常。 您可以通过将以下内容添加到ObjectMapper
实例来禁用此功能:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
您可能会想要修复未知属性。 可能是services
属性,您已在Java类中将其声明为containers
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.