【问题标题】:JsonIgnore and JsonProperty not behaving as I expectJsonIgnore 和 JsonProperty 的行为不符合我的预期
【发布时间】:2013-10-18 04:55:57
【问题描述】:

我有一个简单的类,我想使用 Jackson 将其反序列化为 JSON。我想在我的 JSON 中逻辑地重命名一个字段,而另一个我想与我的 Java 类中定义的名称相同。

  @JsonSerialize(include = Inclusion.NON_NULL)
public static class Manifest {

  public Manifest(){
    this.files = new ArrayList<String>();
  }

  @JsonProperty("manifest-version")
  private String manifestVersion;

  private ArrayList<String> files; 

  @JsonIgnore
  public String getManifestVersion() {
    return manifestVersion;
  }

  @JsonIgnore
  public void setManifestVersion(String manifestVersion) {
    this.manifestVersion = manifestVersion;
  }

  public ArrayList<String> getFiles() {
    return files;
  }

  public void setFiles(ArrayList<String> files) {
    this.files = files;
  }
  public void addFile(String file) {
    this.files.add(file);
  }

}

我期望 getter/setter 的 @JsonIgnore 导致 manifestVersion 不成为 JSON 属性(但应该为 manifest-version 创建一个 JSON 属性,我在其中定义了 @JsonProperty。

预期的输出是 { “清单版本”:“2.0” } 实际输出为 { “清单版本”:“2.0”, “清单版本”:“2.0” }

任何帮助将不胜感激。

【问题讨论】:

  • 实际输出是多少?
  • 更新帖子以包括预期和实际
  • 您能否也展示一下如何序列化 Manifest 对象?
  • @Michal,我像这样序列化它,作为测试插入到清单文件 mfS = mapper.writer().withDefaultPrettyPrinter().writeValueAsString(mf);

标签: jackson


【解决方案1】:

我尝试使用 Jackson 2.2 执行您的代码,我得到了预期的输出

import java.util.ArrayList;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion;

public class Test {

  @JsonSerialize(include = Inclusion.NON_NULL)
  public static class Manifest {

    public Manifest(){
      this.files = new ArrayList<String>();
    }

    @JsonProperty("manifest-version")
    private String manifestVersion;

    private ArrayList<String> files; 

    @JsonIgnore
    public String getManifestVersion() {
      return manifestVersion;
    }

    @JsonIgnore
    public void setManifestVersion(String manifestVersion) {
      this.manifestVersion = manifestVersion;
    }

    public ArrayList<String> getFiles() {
      return files;
    }

    public void setFiles(ArrayList<String> files) {
      this.files = files;
    }
    public void addFile(String file) {
      this.files.add(file);
    }

  }

  public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper obj = new ObjectMapper();
        Manifest m = new Manifest();
        m.setManifestVersion("2.0");
        System.out.println(obj.writeValueAsString(m));      
    }
}

输出:{"files":[],"manifest-version":"2.0"}

你用的是什么版本的jackson?

【讨论】:

  • 好的,看来您是对的,而且我的原始代码实际上是正确的并且行为符合预期。事实证明,当我在构建的 .war 中手动交换编译的类文件时,我没有注意到这个类(作为嵌套类 Outer$Inner.class)没有通过我的脚本移动,因为文件名包含一美元。所以我无意中从一个没有@JsonIgnores 的正确构建的战争中测试了一个旧版本的类文件。
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多