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