【问题标题】:Jackson JSON generator creates null JSON values for missing objectsJackson JSON 生成器为丢失的对象创建空 JSON 值
【发布时间】:2013-02-13 16:37:05
【问题描述】:

我已经开始使用 Jackson 作为 JSON 生成器,作为 google GSON 的替代品。我遇到了杰克逊生成对象的问题:如果对象确实为空,则为空。另一方面,GSON 在 JSON 中生成 NO 条目,这是我想要的行为。当对象丢失时,有没有办法阻止 Jackson 生成空对象/值?

杰克逊

        ObjectMapper mapper = new ObjectMapper();
    StringWriter sw = new StringWriter();
    mapper.writeValue(sw, some_complex_object);
    String jackson = sw.getBuffer().toString();

    System.out.println("********************* START JACKSON JSON ****************************");
    System.out.println(jackson);
    System.out.println("********************* END JACKSON JSON ****************************");

生成这个:

{"eatwithrustyspoon":{"urlList":null,"device":"iPad","os":"iPhone OS","peer_id":

GSON 看起来像这样:

        Gson gson = new Gson();
    String json = gson.toJson(some_complex_object);

    System.out.println("********************* START GSON JSON ****************************");
    System.out.println(json);
    System.out.println("********************* END GSON JSON ****************************");

它会生成这个(这是我想要的 - 请注意“urlList”:null 没有生成):

{"eatwithrustyspoon":{"device":"iPad","os":"iPhone OS","peer_id"

【问题讨论】:

    标签: java json jackson gson


    【解决方案1】:

    来自Jackson FAQ

    我可以省略写入具有空值的 Bean 属性吗? (“如何防止写入空属性”,“如何抑制空值”)

    是的。根据JacksonAnnotationSerializeNulls,您可以使用:

      objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
      // or (for older versions):
      objectMapper.configure(SerializationConfig.WRITE_NULL_PROPERTIES, false);
    

    瞧,没有更多的空值。请注意,您必须在 bean 序列化之前配置映射器,因为此设置可能与序列化程序一起缓存。因此,设置得太晚可能会阻止更改生效。

    【讨论】:

    • 这对我不起作用(一个无法解读的编译时错误),但它给了我一个很好的提示——如果我添加这个:@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)在我的可序列化类之上,一切正常。
    • 呸,抱歉 - 一个链接也应该在那里(已编辑),尽管其中一个应该可以工作(你不应该注释你的 POJO)。
    • 这在全局 ObjectMapper 级别对我有所帮助。如果我需要在 bean/类或字段/属性级别配置它,使用 JsonInclude 似乎是可行的方法。
    【解决方案2】:

    我的问题有点不同,实际上我得到的是 POJO 类属性的 Null 值。

    但是我通过给我的 pojo 类中的属性提供映射解决了这个问题:

    @JsonProperty("PROPERTY_NAME")

    认为它可以帮助某人:)

    【讨论】:

      【解决方案3】:

      以下解决方案救了我。

        objectMapper.setSerializationInclusion(Include.NON_NULL);
      

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多