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