如何隐藏Jackson和@JsonIgnore映射到JSON的对象的某些字段失败

时间:2016-10-05 04:50:09

标签: java json jackson jax-rs

我需要在响应对象中隐藏模型类中的一些字段。 I tried to follow this SO answer 但没有运气。

当某个字段有getter和setter时,@ JsonIgnore注释似乎不起作用。请参阅以下代码段以获取说明。

@ApiModel(description = "")
public class APIInfoDTO  {

  private String id = null;

  @JsonIgnore //this field will not be hidden when getters and setters are defined..
  private String name = null;


  private String status = null;

  @JsonIgnore // this "info" field is hidden since there are no getters                                 and setters for this field 
  private String info = "adncusdvshbdvsbvhdb";

  /**
   **/
  @ApiModelProperty(value = "")
  @JsonProperty("id")
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }


  /**
   **/
  @ApiModelProperty(value = "")
  @JsonProperty("name")
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }


  /**
   **/


@ApiModelProperty(value = "")
  @JsonIgnore
  public String getDescription() {
    return description;
  }
  @JsonProperty("description")
  public void setDescription(String description) {
    this.description = description;
  }

此外,这是对象映射的代码片段

public static APIInfoDTO fromAPIToInfoDTO(API api) {
    APIInfoDTO apiInfoDTO = new APIInfoDTO();
    apiInfoDTO.setDescription(api.getDescription());
    apiInfoDTO.setContext(api.getContext());
    apiInfoDTO.setId(api.getUUID());
    APIIdentifier apiId = api.getId();
    apiInfoDTO.setName(apiId.getApiName());
    apiInfoDTO.setVersion(apiId.getVersion());
    apiInfoDTO.setProvider(apiId.getProviderName());
    apiInfoDTO.setStatus(api.getStatus().toString());
    String providerName = api.getId().getProviderName();
    apiInfoDTO.setProvider(APIUtil.replaceEmailDomainBack(providerName));
    return apiInfoDTO;
}

任何有用的答案都将受到高度赞赏..谢谢

[更新] @JsonIgnore与org.codehaus.jackson一起使用:jackson-core-asl:1.8.6但是使用com.fasterxml.jackson.core失败:jackson-annotations:2.7.2 ..任何想法为什么? ??

2 个答案:

答案 0 :(得分:0)

将@JsonIgnore Annotation添加到getter方法中。

或尝试在课程级别添加@JsonIgnoreProperties(value={"name"}),如果这是您的选项

更新

如果你的类路径中有Proper Jackson Library(组:'com.fasterxml.jackson.core',名字:'jackson-core'),你场上的@JsonIgnore就可以了。只要你拥有的getter方法是一个标准的getter,你就不必用@JsonIgnore来注释getter。

答案 1 :(得分:-1)

如果您只想根据字段注释序列化和反序列化对象,则应将Jackson ObjectMapper配置为忽略getter和setter方法:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE));

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

也可以使用@JsonAutoDetect注释在类级别配置。

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
public class APIInfoDTO  {
    // ...
}