我看过其他一些与此类似的帖子,所以如果已经提出这个问题,我会事先道歉。但是我无法让任何解决方案适合我。
我从一个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才能处理空值或空值?
非常感谢。
答案 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
}
}