【问题标题】:how to ignore null when deserializing from json string to object?从json字符串反序列化到对象时如何忽略null?
【发布时间】:2015-03-03 22:28:50
【问题描述】:

我有一个类定义如下:

// Ignore all the unknown properties in input JSON
@JsonIgnoreProperties(ignoreUnknown = true)

// Only include non null values in deserialized Java object.
@JsonInclude(value = Include.NON_NULL)
public class Person {


@JsonProperty("person_id")
private String personId;

@JsonProperty("school")
private String school;

@JsonProperty("hobbies")
private Map<String, List<AttributeBag>> hobbies = new   HashMap<String, List<AttributeBag>>();

@JsonProperty("tasks")
private Map<String, Map<String, AttributeBag>> tasks = new HashMap<String, Map<String, AttributeBag>>();



 public Map<String, List<AttributeBag>> getHobbies() {
    return hobbies;
}


   public Person(String person_id, String school) {
    super();
    this.person_id = person_id;
    this.school = school;

}

当我使用下面的 JSON 字符串从字符串反序列化为对象时,

 {
"person_id":"123",
"school":"stanford University"
}

从我反序列化的对象来看,爱好是创建但为空,甚至任务都没有创建。我期待像“任务”这样的方式,如果 JSON 中没有相应的字段,它不应该在对象中反序列化。

但奇怪的是:当我检查 object.getHobbies()!=null 但任务部分为空时。如果 JSON 中不存在它们,我希望它们在对象中都为 null。

我有一个 Person 类的构造函数,但我没有初始化爱好和任务部分。

非常感谢

【问题讨论】:

  • 发布您的构造函数代码可能会很有用。根据您所拥有的,hobbiestasks 都应该是非空的空地图
  • @MrWiggles 构造函数已更新。为什么他们都应该是非空的。我期望的是,如果它们不在 JSON 中,我不希望它们在对象中反序列化。该怎么做?

标签: java json serialization deserialization


【解决方案1】:
@JsonProperty("hobbies")
private Map<String, List<AttributeBag>> hobbies = new   HashMap<String, List<AttributeBag>>();

@JsonProperty("tasks")
private Map<String, Map<String, AttributeBag>> tasks = new HashMap<String, Map<String, AttributeBag>>();

从上面的代码可以清楚地看出,无论如何,您正在为爱好和任务创建 对象,我无法理解为什么没有创建您的任务(它应该被创建为空地图)

回答你的问题@JsonInclude(value = Include.NON_NULL) 应该可以解决问题!

【讨论】:

  • 但奇怪的是,从 json 字符串反序列化到对象时,并没有创建任务。有什么理由吗?
  • 如果我不放@JsonProperty,objectmapper怎么知道,哪个字段即“任务”反序列化到哪个对象,即Map>
  • 我不是指向@JsonProperty 我是说您正在创建new HashMap... 并将其分配给任务。这意味着无论json中是否有任何值,它都会创建
  • 好点。但奇怪的是,任务并没有被创造出来,而只是为了爱好。为什么?
【解决方案2】:

JSON 反序列化器不会尝试设置未出现在 JSON 结构中的字段,而是以下几行:

@JsonProperty("hobbies")
private Map<String, List<AttributeBag>> hobbies = new   HashMap<String, List<AttributeBag>>();

@JsonProperty("tasks")
private Map<String, Map<String, AttributeBag>> tasks = new HashMap<String, Map<String, AttributeBag>>();

正在创建对象构造的值。

如果您希望它们为空,则不要在对象中分配它们,只需保留声明即可:

@JsonProperty("hobbies")
private Map<String, List<AttributeBag>> hobbies;

@JsonProperty("tasks")
private Map<String, Map<String, AttributeBag>> tasks;

【讨论】:

  • 但奇怪的是,从 json 字符串反序列化为对象时,并没有创建任务。有什么理由吗?
  • 如果我不放@JsonProperty,objectmapper怎么知道,哪个字段即“任务”反序列化到哪个对象,即Map>
  • 那么您不应该只使用“动态块”,如本指南第 3.2 节gerardnico.com/lang/java/initialization_block 所示来初始化这些地图吗?
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多