如何防止一个Map中的空值和一个Bean中的空字段通过Jackson序列化
我有一个Map<String,Foo> foosMap
,我想通过Jackson序列化。 现在我想在序列化过程中进行以下两个设置:
- 地图可以有大量的空值和空键,我不希望空值序列化。
- 对于所有那些正在序列化的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 }
}
- 我应该如何在我的RESTful JAX-RS Web服务中logging未捕获的exception?
- 如何使用JacksonparsingJSONstring到数组
- jacksonJSON自定义序列化的某些领域
- 我如何从jackson的一个自定义反序列化器中调用默认的反序列化器
- jackson – 具有双向关系的实体序列化(避免循环)
- 如何在jacksonparsing一个JSONstring到JsonNode?
- 使用Jackson的ObjectMapper的JSON对象的顺序
- 避免对未获取的惰性对象进行Jackson序列化
- 为什么当一个构造函数用@JsonCreator注解时,它的参数必须用@JsonProperty注解?