繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM