jackson将未知属性名称反序列化为自定义实体

时间:2016-04-03 19:48:08

标签: java json jackson deserialization

我正在尝试使用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

2 个答案:

答案 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