当前位置: 首页 > 面试题库 >

杰克逊解串器-将null集合更改为空

韦飞尘
2023-03-14
问题内容

我有一个包含集合作为属性的实体:

public class Entity {

    @JsonProperty(value="homes")
    @JsonDeserialize(as=HashSet.class, contentAs=HomeImpl.class)
    private Collection<Home> homes = new ArrayList<Home>();

}

如果请求包含null作为请求属性:

{
  "homes": null
}

然后将homes设置为null。我要做的是将房屋设置为空清单。我是否需要为此编写特殊的反序列化器,或者有一个用于集合的解串器?我试过的是这种反序列化器,但看起来很丑陋(它不是通用的,而是使用实现而不是接口)。

public class NotNullCollectionDeserializer extends JsonDeserializer<Collection<HomeImpl>> {

  @Override
  public Collection<HomeImpl> deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    return jsonParser.readValueAs(new TypeReference<Collection<HomeImpl>>(){});
  }

  @Override
  public Collection<HomeImpl> getNullValue() {
    return Collections.emptyList();
  }
}

这么几个问题:

  1. 是否有一些杰克逊属性在反序列化期间将null更改为空集合?
  2. 如果第一点没有,那么我需要为此写反序列化器吗?如果可以,我可以写一个通用的吗?

问题答案:

我也找不到为此的Jackson属性或注释。因此,我必须对第一个问题回答“否”。但是我建议使用一个简单的setter而不是特殊的反序列化器:

public class Entity {

    @JsonDeserialize(contentAs = HomeImpl.class)
    private Collection<Home> homes = new ArrayList<>();

    public void setHomes(List<Home> homes) {
        if (homes != null)
            this.homes = homes;
    }
}

这是通用的,因为它仅使用Home接口而不是HomeImpl。你不需要@JsonProperty因为杰克逊将关联setHomeshomes



 类似资料:
  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 问题内容: 我有这个回应: 然后,我要基于 exercise_type 属性实例化不同的对象实例(的子类),因此我在以下位置创建此混合: 所以我创建如下 我的测试: 问题在于,由于某种原因,用作属性on 的 exercise_type 属性被映射为 null 。知道我该如何解决吗? 问题答案: 最后,我在API文档中找到了解决方案 关于类型标识符可见性的注意事项:默认情况下,类型标识符的反序列化(

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 首先,我不熟悉Jython。我正在寻找一种将python代码集成到Java项目中的方法。因此我正在调查Jython。 我正在尝试将一个 json 字符串转换为 Java 对象 - 在 python 中。 首先,我一直在努力让Jython找到我的java类。由于缺乏更优雅的解决方案,我可以通过简单地执行以下操作来向前迈进: 无论如何。。。 我正在尝试以下操作: 但是,在运行时,我收到以下错误: 我不

  • 处理注释 mixin 的杰克逊代码是否可以由第三方重用来混合非杰克逊注释? 处理混合蛋白的核心杰克逊类是什么?