元のデータ構造をシリアライズするように変更して、シリアライズしたい実際の値をより適切に表現することが合理的でMap
ある場合、それはおそらくまともなアプローチであり、必要なジャクソン構成の量を減らす可能性があります。たとえば、null
Jackson に電話する前に、可能であればキー エントリを削除してください。それは言った...
Map
null 値を持つエントリのシリアル化を抑制するには:
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))
null 値を持つプロパティのシリアル化を抑制するには、直接設定するObjectMapper
か、@JsonInclude
アノテーションを利用できます。
mapper.setSerializationInclusion(Include.NON_NULL);
また:
@JsonInclude(Include.NON_NULL)
class Foo
{
public String bar;
Foo(String bar)
{
this.bar = bar;
}
}
私が理解しているように、 nullMap
キーを処理するには、いくつかのカスタムシリアル化が必要です。
キーを空の文字列としてシリアル化する簡単な方法null
(前述の 2 つの構成の完全な例を含む):
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;
}
}
Map
キーによるエントリのシリアル化を抑制するnull
には、さらにカスタムのシリアル化処理が必要になります。