从JSON响应(Spring REST)中删除空对象和空对象,其中包含空对象



我想从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结构的每个"部分"(或对象),然后执行我们必须执行的操作(在我的情况下,我会修复输入,但我猜您可以直接删除它)

最新更新