我正在尝试使用jackson反序列化yaml文件,它的工作方式类似于Json,所以为方便起见,我将使用Json。
我的Json结构如下所示:
{
"version": "2",
"services": {
"app": {
"build": {
"context": "./",
"args": {}
},
"image": "imageName"
},
"results": {
"build": "./",
"image": "imageName"
}
}
}
我想使用jackson反序列化这个,但是在使用默认的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
答案 0 :(得分:2)
修改强>
查看新的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...
}
通过这种方式,您可以获得从键(String)到ContainerModel的映射。
原帖
好吧,你的Json示例有一个名为services
的属性,你的类有一个名为containers
的属性。您不应期望这些属性之间的自动映射。
要自动映射它们,请使用相同的属性名称。如果您不想或不想,您可以随时使用杰克逊的注释@JsonProperty
。
此外,如果存在您不希望映射的字段,则应实例化新的ObjectMapper,并将其配置为忽略未知字段。像这样:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
另外,我假设您获得了映射ServiceModel类的异常,而不是//Known data structure
。但无论如何,我的建议应该在两种情况下解决问题。
答案 1 :(得分:0)
看起来您正在尝试反序列化不存在的属性。
默认情况下,当您尝试反序列化未知属性时,Jackson会抛出异常。您可以通过将以下内容添加到ObjectMapper
实例来禁用此功能:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
你可能想要修复未知属性。它可能是services
属性,您在Java类中声明为containers
。