Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JSON响应(Spring REST)中删除空对象和空对象,空对象中包含空对象_Java_Json - Fatal编程技术网

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

Java 从JSON响应(Spring REST)中删除空对象和空对象,空对象中包含空对象,java,json,Java,Json,我想从JSON响应中删除Null和空值 下面是Json字符串: {"implDisplayablePricePlan": [ { "productSpecPricing": { "childPricingSchema": {} }, "assignedPricePlanID": "abc", "name": "GOLD", "ac

我想从JSON响应中删除Null和空值

下面是Json字符串:

{"implDisplayablePricePlan": [
          {
            "productSpecPricing": {
              "childPricingSchema": {}
            },
            "assignedPricePlanID": "abc",
            "name": "GOLD",
            "action": "Something",
            "status": "Something",
            "selected": true,
            "crossProductDiscount": false,

            "displayInformation": {
              "visible": true,
              "enabled": false
            }
          }]
}

在本例中:ProductSpecPricingSchema与childPricingSchema的定价


删除空对象的最佳方法是什么,它对于任何JSON字符串都是通用的。

这取决于您如何获取/创建JSON文件

如果您正在创建它,那么,在创建过程中,如果某个值不存在、为null、为void或其他您不希望的值,请不要插入它

但是,如果您从其他人那里接收到这个JSON,那么在解析过程中,获取密钥/对值,如果您不需要,也不要将其添加到您的对象中

如果没有您程序中的详细信息,我们无法帮助进一步编辑1:此PHP代码(改编自我使用的代码):

$input=file\u get\u contents($name,“r”);
如果($input!=FALSE){
对于($i=0;$i=100){
$counter=0;
节省($缓冲区);
$buffer=“”;
}
}else if($input[$i]==']')){
节省($缓冲区);
$buffer=“”;
$i=strlen($input);
}
}
}
在其中,我们将首先成功获取JSON文件。然后,打开文件,读取JSON结构的每个“部分”(或对象),然后按照我们必须做的做(在我的情况下,我会修复输入,但我想您可以直接删除它。)

使用它,您可以轻松设置首选项以序列化对象

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));
我明白了:

{
  "implDisplayablePricePlan" : [ {
    "productSpecPricing" : { },
    "assignedPricePlanID" : "abc",
    "name" : "GOLD",
    "action" : "Something",
    "status" : "Something",
    "selected" : true,
    "crossProductDiscount" : false,
    "displayInformation" : {
      "visible" : true,
      "enalble" : false
    }
  } ]
}
由于
productSpecPricing
不为null(或空数组/集合),因此显示为空,要解决此问题,您必须添加一个筛选器:

使用
@JsonFilter(“myFilter”)

过滤器:

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的REST(使用Spring)服务。因此,当它显示时,它显示的是空对象。我想在REST服务中将空对象显示为JSON之前删除它。在SpringXML中使用对象映射器也不起作用。我希望对于任何REST调用都能有一种通用的方法来实现这一点。那么,将输入作为文件读取,迭代内容,并在
“:null
:”“
”之后进行检查怎么样?这只是冰山一角。文件是巨大的。是的,但您无论如何都会收到文件,据我所知,大多数系统都会将JSON作为单个输入读取(并将其完全加载到RAM中)。你能帮我一下吗?因为我试过readTree的功能,但没用。一些示例会让trickI拥有REST类,这些类是使用@products(MediaType.APPLICATION\u JSON)@Consumes(MediaType.APPLICATION\u JSON)配置的,因此我希望在响应主体中捕获JSON并删除所有空值。我不熟悉休息和弹簧,所以在翻译过程中可能会丢失一些东西。任何帮助都将不胜感激。。。。因此,您不是生成json?的人,您使用的是Spring?,您应该在您的问题中提供相关信息。我使用@Path(“/somepath”)@products(MediaType.APPLICATION_json)@Consumes(MediaType.APPLICATION_json)在生成json响应的interfaceclass的顶部,这甚至适用于Spring,因为它通常使用Jackson。您必须配置消息转换器(请参见
MappingJackson2MessageConverter.setObjectMapper()
)是的,但我建议扩展
ObjectMapper
以添加设置并将其设置为消息转换器
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
    }
  } ]
}