如果修改原始的
Map
数据结构以更好地表示希望序列化的实际值是合理的,那可能是一个不错的方法,这可能会减少需要进行的Jackson配置。例如,在调用Jackson之前,尽可能删除
null
键条目。话虽如此...
为了禁止序列化具有null值的
Map
条目:
在Jackson 2.9之前,您仍然可以使用
WRITE_NULL_MAP_VALUES
,但请注意它已经移动到
SerializationFeature
:
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false)
自Jackson 2.9版本以来
WRITE_NULL_MAP_VALUES
已经被弃用,您可以使用以下等效方式:
mapper.setDefaultPropertyInclusion(
JsonInclude.Value.construct(Include.ALWAYS, Include.NON_NULL))
为了抑制序列化具有空值的属性,您可以直接
配置ObjectMapper
,或利用
@JsonInclude
注释:
mapper.setSerializationInclusion(Include.NON_NULL)
或者:
@JsonInclude(Include.NON_NULL)
class Foo
{
public String bar;
Foo(String bar)
{
this.bar = bar;
}
}
为了处理空的 Map
键,需要进行一些自定义序列化,据我所知。
将 null
键序列化为空字符串的简单方法(包括先前提到的两个配置的完整示例):
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"));
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));
}
}
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
条目序列化,需要进行进一步的自定义序列化处理。