如何防止一个Map中的空值和一个Bean中的空字段通过Jackson序列化

我有一个Map<String,Foo> foosMap ,我想通过Jackson序列化。 现在我想在序列化过程中进行以下两个设置:

  1. 地图可以有大量的空值和空键,我不希望空值序列化。
  2. 对于所有那些正在序列化的Foos,我不想序列化在Foo中引用的空对象。

达到这个目标的最好方法是什么? 我在我的项目中使用jackson-core1.9和jackson-mapper1.9jar子。

如果为了更好地表示需要序列化的实际值而更改要Map的原始Map数据结构是合理的,那么这可能是一个体面的方法,这可能会减less必要的Jacksonconfiguration的数量。 例如,只要可能,在调用Jackson之前删除null键条目。 那说…


要使用空值来抑制序列化Map条目,仍然可以使用WRITE_NULL_MAP_VALUES ,但请注意将其移至SerializationFeature

 mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); 

要使用空值来压缩序列化属性,可以直接configurationObjectMapper ,或者使用@JsonInclude注解:

 mapper.setSerializationInclusion(Include.NON_NULL); 

要么:

 @JsonInclude(Include.NON_NULL) class Foo { public String bar; Foo(String bar) { this.bar = bar; } } 

为了处理空的Map键,一些自定义序列化是必要的,据我所知。

将空string作为空string的简单方法(包括前面提到的两个configuration的完整示例):

 import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; public class JacksonFoo { public static void main(String[] args) throws Exception { Map<String, Foo> foos = new HashMap<String, Foo>(); foos.put("foo1", new Foo("foo1")); foos.put("foo2", new Foo(null)); foos.put("foo3", null); foos.put(null, new Foo("foo4")); // System.out.println(new ObjectMapper().writeValueAsString(foos)); // Exception: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); mapper.setSerializationInclusion(Include.NON_NULL); mapper.getSerializerProvider().setNullKeySerializer(new MyNullKeySerializer()); System.out.println(mapper.writeValueAsString(foos)); // output: // {"":{"bar":"foo4"},"foo2":{},"foo1":{"bar":"foo1"}} } } class MyNullKeySerializer extends JsonSerializer<Object> { @Override public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused) throws IOException, JsonProcessingException { jsonGenerator.writeFieldName(""); } } class Foo { public String bar; Foo(String bar) { this.bar = bar; } } 

要禁止使用null键序列化Map条目,需要进一步自定义序列化处理。

对于jackson版本<2.0,在被序列化的类上使用这个注释:

 @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

答案似乎有点老,我所做的就是使用这个映射器来转换一个MAP

  ObjectMapper mapper = new ObjectMapper().configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false); 

一个简单的Map

  Map<String, Object> user = new HashMap<String,Object>(); user.put( "id", teklif.getAccount().getId() ); user.put( "fname", teklif.getAccount().getFname()); user.put( "lname", teklif.getAccount().getLname()); user.put( "email", teklif.getAccount().getEmail()); user.put( "test", null); 

像这样使用它,例如:

  String json = mapper.writeValueAsString(user); 

我的解决scheme,希望帮助
自定义ObjectMapper和configuration到春季XML(注册消息转换)

 public class PyResponseConfigObjectMapper extends ObjectMapper { public PyResponseConfigObjectMapper() { disable(SerializationFeature.WRITE_NULL_MAP_VALUES); //map no_null setSerializationInclusion(JsonInclude.Include.NON_NULL); // bean no_null } 

}