我想从JSON响应中删除Null和Empty值。
下面是Json字符串:
{"implDisplayablePricePlan": [
{
"productSpecPricing": {
"childPricingSchema": {}
},
"assignedPricePlanID": "abc",
"name": "GOLD",
"action": "Something",
"status": "Something",
"selected": true,
"crossProductDiscount": false,
"displayInformation": {
"visible": true,
"enabled": false
}
}]
}
在这个例子中:productSpecPricing with childPricingSchema
什么将是最好的方法来删除空对象,这将是通用的任何JSON字符串
使用Jackson您可以轻松地设置您的首选项来序列化您的对象
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.setSerializationInclusion(Include.NON_EMPTY);
ObjectWriter writer = objectMapper.writer();
System.out.println(writer.writeValueAsString(YOUR_OBJECT));
I got this:
{
"implDisplayablePricePlan" : [ {
"productSpecPricing" : { },
"assignedPricePlanID" : "abc",
"name" : "GOLD",
"action" : "Something",
"status" : "Something",
"selected" : true,
"crossProductDiscount" : false,
"displayInformation" : {
"visible" : true,
"enalble" : false
}
} ]
}
作为productSpecPricing
不是null(或空数组/集合),它显示,要解决它,你必须添加一个过滤器:
用@JsonFilter("myFilter")
productSpecPricing
属性的类FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", filter);
ObjectWriter writer = objectMapper.writer(filters);
过滤器:PropertyFilter filter = new SimpleBeanPropertyFilter() {
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen,
SerializerProvider provider, PropertyWriter writer)
throws Exception {
if (include(writer)) {
System.out.println(writer.getName());
if (!writer.getName().equals("productSpecPricing")) {
writer.serializeAsField(pojo, jgen, provider);
return;
} else {
ProductSpecPricing productSpecPricing = ((YOU_OBJECT) pojo).getProductSpecPricing();
if (productSpecPricing != null && productSpecPricing.getChildPricingSchema() != null && !productSpecPricing.getChildPricingSchema().isEmpty()) {
writer.serializeAsField(pojo, jgen, provider);
}
}
} else if (!jgen.canOmitFields()) {
writer.serializeAsOmittedField(pojo, jgen, provider);
}
}
@Override
protected boolean include(PropertyWriter writer) {
return true;
}
@Override
protected boolean include(BeanPropertyWriter writer) {
return true;
}
};
应用过滤器后,结果是:
{
"implDisplayablePricePlan" : [ {
"assignedPricePlanID" : "abc",
"name" : "GOLD",
"action" : "Something",
"status" : "Something",
"selected" : true,
"crossProductDiscount" : false,
"displayInformation" : {
"visible" : true,
"enalble" : false
}
} ]
}
这取决于你如何获取/创建JSON文件。
如果您正在创建它,那么,在创建过程中,如果一个值不存在,null, void或任何其他您不希望的值,请不要插入它。
然而,如果你从别人那里收到这个JSON,那么在解析期间,获取键/对值,再次,如果你不想要它,不要添加到你的对象。
如果没有你的程序的细节,我们无法进一步帮助
编辑1:
这段PHP代码是(改编自我使用的):$input = file_get_contents($name, "r");
if($input != FALSE) {
for($i=0;$i<strlen($input);$i++){
if($input[$i]=='{'){
$begin= $i;
} else if($input[$i]=='}'){
$buffer .= substr($input,$begin,$i-$begin+1) .",";
if (strpos($buffer,'":null') !== false) {
// Drop the current line
} else {
// Line is correct, keep on writting
}
if($counter>=100 ){
$counter= 0;
save($buffer);
$buffer = "";
}
} else if($input[$i]==']'){
save($buffer);
$buffer = "";
$i = strlen($input);
}
}
}
在其中,我们将首先成功获取JSON文件。然后,打开文件,读取JSON结构的每个"部分"(或对象),然后执行我们必须执行的操作(在我的情况下,我会修复输入,但我猜您可以直接删除它)