Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson,如何用自定义名称反序列化字段?_Java_Json_Jackson - Fatal编程技术网

Java Jackson,如何用自定义名称反序列化字段?

Java Jackson,如何用自定义名称反序列化字段?,java,json,jackson,Java,Json,Jackson,我尝试将Jira问题从RESTAPI反序列化到一个对象中。这很直截了当。我挣扎的地方是将Jira中的自定义字段映射到属性上。我尝试过使用自定义反序列化程序,但它没有“启动” REST调用的Json如下所示: (部分零件已剥离) 自定义字段名在我的应用程序(“customfield_10700”)中配置,我希望将其映射到属性: private Set<String> deploymentEnvironments; 发行人发起人类别: import java.io.Serializab

我尝试将Jira问题从RESTAPI反序列化到一个对象中。这很直截了当。我挣扎的地方是将Jira中的自定义字段映射到属性上。我尝试过使用自定义反序列化程序,但它没有“启动”

REST调用的Json如下所示: (部分零件已剥离)

自定义字段名在我的应用程序(“customfield_10700”)中配置,我希望将其映射到属性:

private Set<String> deploymentEnvironments;
发行人发起人类别:

import java.io.Serializable;

import com.fasterxml.jackson.annotation.JsonProperty;

public class IssueResponsePoc implements Serializable {

    @JsonProperty private String id;
    @JsonProperty private String key;

    @JsonProperty private IssueFieldsPoc fields;

}
有趣的类:IssueFieldsPoc

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Set;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import com.fasterxml.jackson.annotation.JsonProperty;

public class IssueFieldsPoc implements Serializable {

    @JsonProperty private String summary;
    @JsonProperty private IssueType issuetype;
    @JsonProperty private IssueUser creator;
    @JsonProperty private Date created;
    @JsonProperty private IssueUser reporter;
    @JsonProperty private IssuePriority priority;
    @JsonProperty private IssueResolution resolution;
    @JsonProperty private List<String> labels;
    @JsonProperty private Date resolutiondate;
    @JsonProperty private IssueUser assignee;
    @JsonProperty private Date updated;
    @JsonProperty private IssueStatus status;

    @JsonDeserialize private Set<String> deploymentEnvironments;
    // @JsonDeserialize(using = CustomFieldDeserializer.class) private Set<String> deploymentEnvironments;

    public Set<String> getDeploymentEnvironments() {
        return deploymentEnvironments;
    }

    public void setDeploymentEnvironments(Set<String> deploymentEnvironments) {
        this.deploymentEnvironments = deploymentEnvironments;
    }
}
但我更喜欢在反序列化程序中使用这种逻辑

有没有一种方法可以帮助jackson何时启动此动态属性名的反序列化程序(因为它知道属性名)

更新: 已将模块注册到映射程序。 如答案中所示,向字段添加准确的属性名称:

@JsonProperty("customfield_10700")
@JsonDeserialize
private Set<String> deploymentEnvironments;
@JsonProperty(“customfield_10700”)
@JsonDeserialize
专用集部署环境;

将允许反序列化程序启动。但是如上所述,这是一个可配置的值,我不能(或者我不想)直接放在映射代码中。

好吧,如果我理解正确,您需要将json转换为java对象

如果希望该类忽略未知属性,则需要将
@JsonIgnoreProperties(ignoreUnknown=true)
添加到必须忽略的类中(
IssueResponsePoc
仅或
issuefeldspoc

@JsonProperty(value=)
中,您可以在java类中为字段使用任何名称

如果使用相应的注释(
@JsonProperty
@JsonIgnore
等等)重复java类的json嵌套级别,则不需要使用整个反序列化程序


如果您想处理类中的未知字段,您可以使用
@JsonAnySetter
实现此目的

我认为您的问题可以通过将
@JsonProperty(“customfield_10700”)
设置为
部署环境
字段来解决,如下所示。在这种情况下,您不需要自定义反序列化程序

public class IssueFieldsPoc implements Serializable {

    @JsonProperty private String summary;
    @JsonProperty private Date created;
    @JsonProperty private List<String> labels;
    @JsonProperty private Date resolutiondate;

    @JsonProperty private Date updated;

    @JsonProperty("customfield_10700")
    private Set<String> deploymentEnvironments;
public类issuefeldspoc实现可序列化{
@JsonProperty私有字符串摘要;
@JsonProperty私有日期创建;
@JsonProperty私有列表标签;
@JsonProperty私有日期决议日期;
@JsonProperty私有数据更新;
@JsonProperty(“customfield_10700”)
专用集部署环境;

看起来您没有将持有
CustomFieldDeserializer
模块注册到
IssueFieldsWithDeserializerTest
中的
ObjectMapper
实例。我想您应该调用
mapper.registerModule(模块)
在尝试读取值之前。谢谢。这当然是真的。我已经添加了代码来注册模块。反序列化程序仍然没有成功。属性名称似乎真的有一定的相关性。我不知道如何告诉安装程序反序列化程序告诉jackson它负责哪些字段。这当然有效但是该属性的值是可配置的,并且会随着后端的不同而变化。因此“customfield_10700”是在运行时从配置中读取的,不能作为常量使用。不,我认为您的问题是错误的。这已经是我问题的一部分了。
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;

public class CustomFieldDeserializer extends StdDeserializer<Set<String>> {

    private final String customFieldName;

    public CustomFieldDeserializer(String customFieldName) {
        super((Class<?>) null);
        this.customFieldName = customFieldName;
    }

    @Override
    public Set<String> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        System.out.println("deserializer started!");
        return null;
    }

    @Override
    public Collection<Object> getKnownPropertyNames() {
        return Collections.singletonList(customFieldName);
    }
}
@JsonAnySetter
public void setCustomProperty(String name, Object value) {
    if(StringUtils.startsWith(name, "customfield_")) {
        this.customFields.put(name, value);
    }
}
@JsonProperty("customfield_10700")
@JsonDeserialize
private Set<String> deploymentEnvironments;
public class IssueFieldsPoc implements Serializable {

    @JsonProperty private String summary;
    @JsonProperty private Date created;
    @JsonProperty private List<String> labels;
    @JsonProperty private Date resolutiondate;

    @JsonProperty private Date updated;

    @JsonProperty("customfield_10700")
    private Set<String> deploymentEnvironments;