我正在调用一个API,它返回一个转换为List的值数组
我想知道是否有办法告诉Jackson(或feign)在反序列化时排除< code>null
列表项。
我已经查看了< code>@JsonInclude,但这适用于< code>null属性,而不适用于< code>null集合项。
编辑
值显示为null的原因是因为选项< code >反序列化功能。正在使用READ _ UNKNOWN _ ENUM _ VALUES _ AS _ NULL 。
将注记@JsonInclude(Include.NON_NULL)添加到要映射的类中。这将解决问题
您可以将JsonSetter
注释与Nulls.SKIP.一起使用参见下面的示例:
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Work work = new Work();
work.setDays(Arrays.asList(null, Day.Monday, Day.Tuesday, null, Day.Friday, null));
String json = mapper.writeValueAsString(work);
System.out.println(json);
System.out.println(mapper.readValue(json, Work.class));
}
}
enum Day {Monday, Tuesday, Wednesday, Thursday, Friday}
class Work {
private List<Day> days;
public List<Day> getDays() {
return days;
}
@JsonSetter(contentNulls = Nulls.SKIP)
public void setDays(List<Day> days) {
this.days = days;
}
@Override
public String toString() {
return "Created{" +
"days=" + days +
'}';
}
}
以上代码打印:
{"days":[null,"Monday","Tuesday",null,"Friday",null]}
Created{days=[Monday, Tuesday, Friday]}
编辑
上面的解决方案将不起作用,如果你有未知的枚举值。在这种情况下,您应该使用DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL
或DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE
功能。一种解决方法是手动过滤来自空值
的集合:
public void setDays(List<Day> days) {
this.days = days.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
当然,我们可以为收集实现自定义反序列化程序并跳过它,但是…
基本上,我不希望在生成的JSON文件中出现任何空的JSON数组或对象。我已经使用以下方法相应地配置了ObjectMapper: 这适用于数组、集合和字符串。但是,如果我有一个空对象(=所有属性都为null或empty),它仍然会显示在生成的JSON中,如下所示:
问题内容: 我有一个清单,里面有空清单: 如何删除空列表,以便获得: 我尝试了list.remove(’‘),但这不起作用。 问题答案: 尝试 如果您想摆脱所有“虚假”的东西,例如空字符串,空元组,零,您也可以使用
我已经尝试创建自定义序列化程序,但我无法在那里获得字段名。 在GSON中,我使用了,但Jackson没有这样的功能。有对等的吗?
问题内容: 使用Jersey和Jackson创建REST接口,当其中包含0或1个元素时,如何将列表字段序列化为列表。例如: 当bar没有元素时,结果序列化为;当它包含单个元素时,结果序列化为该元素,而不是包含单个元素的数组。有没有办法让它们始终序列化为数组? 作为参考,我使用的是Jersey 1.10和Jackson 1.9.2。 问题答案: 我很确定您实际上并没有使用Jackson(JSON序列
问题内容: 如何将作为地图的属性序列化为地图的值列表?我已经能够使用吸气剂上的注释进行其他简单的转换。但是,我不确定我想做什么。 问题答案: 我们需要类似的东西,在我们的案例中,我们使用了您所评论的自定义项,这很简单: 使用它的代码:
问题内容: 如何摆脱列表项之间的空白?我正在努力使图像彼此相邻。即使我将样式设置为,它们仍然分开。 CSS HTML 问题答案: 2014年9月1日更新 在现代浏览器中,flex-box是执行此操作的首选方法。就像这样简单: 在这里查看JSFiddle 。 对于旧版浏览器的支持,请参考下面的其他选项,尽管稍微复杂一些,但它们仍然不错。 尽管每个其他答案至少提供了一个好的解决方案,但似乎没有一个提供