Jackson readTree()忽略null和空值

时间:2015-03-03 14:35:13

标签: java json jackson

我看过其他一些与此类似的帖子,所以如果已经提出这个问题,我会事先道歉。但是我无法让任何解决方案适合我。

我从一个Web服务中获取了一大块JSON,然后我想将其藏匿在Amazon的DynamoDB中。但是,返回的JSON中有一些null和空值,DynamoDB不喜欢它。

所以我想从JSON中删除这些值。我目前正在通过readTree()方法使用Jackson进行JSON反序列化,如下所示:

String sitesDataJson = webService.getData();

// create the object mapper and instruct it to skip null values
ObjectMapper mapper = new ObjectMapper();
mapper = mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

JsonNode jsonObj = null;
try {
    jsonObj = mapper.readTree(sitesDataJson);
} catch (IOException e) {
    e.printStackTrace();
}

我想读的JSON如下:

{  
   "domain_override":"",
   "id":"106949",
   "category_override":null,
   "content_topic":null,
   "modified_date":"2013-12-04 20:31:50",
   "market":{  
      "brand_labels":{  
      "op":"allow_all"
  },
  "domains":null,
  "blocked_contentattributes":{  
     "6":true
  },
  "blocked_creativetypes":{  
     "11":true,
     "10":true,
     "5":true
  },
  "brands":{  
     "ids":{  
        "5953":true,
        "4644":true,
        "8418":true,
        "25480":true,
        "95":true,
        "5650":true
     },
     "op":"block"
      },
      "blocked_languages":{  

      },
      "allow_unbranded_buyers":"0"
   },
   "type":"site",
   "status":"Active",
   "account_id":"100766",
   "deleted":"0",
   "v":"2",
   "delivery_medium":"WEB",
   "delivery_medium_id":"2",
   "content_type_id":null,
   "notes":null,
   "platform_id":null,
   "autorefresh_settings":{  

   },
   "created_date":"2013-10-16 16:49:48",
   "external_id":null,
}

使用NON_EMPTY或NON_NULL设置执行readTree()似乎没有任何区别。使用.toString()执行jsonObj的打印显示仍然存在空值和空值。

我是否以错误的方式解决这个问题?是否有更好的(或正确的!)方式来做到这一点?

我还应该补充一点,我尝试过这样做,但是使用GSON,我读取了默认情况下删除这些属性。然而,这也没有消除它们。那么这是否指向使用JSON的一些奇怪之处?

但后来我看不出它是怎么回事,因为我尝试用一​​个非常简单的JSON来测试我的代码(Jackson和GSON):

    String json = "{"
            + "\"name\" : \"val1\","
            + "\"address\" : null"
            + "}";

但是当使用readTree()时,这仍然不会删除address属性。这是否意味着NON_NULL和NON_EMPTY设置对readTree()方法没有影响?它们实际上只是在将对象序列化为JSON时吗?我是否真的需要将我的JSON读入POJO才能处理空值或空值?

非常感谢。

1 个答案:

答案 0 :(得分:2)

我不确定100%我建议的解决方案是否适用于您的情况,但是在反序列化过程中有一种方法可以使用自定义反序列化器。

StringDeserializer deserializer = new StringDeserializer();
SimpleModule module = new SimpleModule("StringDeserializerModule",
                      new Version(1, 0, 0, null));
module.addDeserializer(String.class, deserializer);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

现在,您可以为您认为null / empty的属性添加更多自定义desirializer,并自定义deserialize()表示。

class StringDeserializer extends JsonDeserializer<String>
{
    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt)    throws IOException, JsonProcessingException
   {
        //Customize
   }
}