空の配列シリアル化へのジャクソンヌルリスト
Aug 19 2020
nullリストを空の配列にシリアル化したい。
そのように与えられた:
class MyBean { List values; }
また、値がnullのインスタンスを指定すると、次のようにシリアル化する必要があります。
{ "values": [] }
これをすべてのクラスのすべてのリストのグローバルな動作にしたいと思います。クラスに注釈や特定の処理を追加したくありません。
私は見つけたすべての関連する質問を読みましたが、うまくいくものを思い付くことができませんでした。Listクラスに登録しようとしているカスタムシリアライザーが起動していないようです。
これをプロジェクトで行っている場合は、どうやってそれを行ったのか教えてください。
回答
2 MichałZiober Aug 19 2020 at 09:48
このような場合、JacksonAnnotationIntrospector
クラスをカスタマイズする必要があります。Te serialize null
-sは、デフォルトでクラスをJackson
使用しますcom.fasterxml.jackson.databind.ser.std.NullSerializer
。デフォルトのイントロスペクタークラスを拡張して、をオーバーライドできますfindNullSerializer
。
以下の例を参照してください。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new EmptyArrayJacksonAnnotationIntrospector());
mapper.writeValue(System.out, new ListWrapper());
}
}
class EmptyArrayJacksonAnnotationIntrospector extends JacksonAnnotationIntrospector {
@Override
public Object findNullSerializer(Annotated a) {
if (List.class.isAssignableFrom(a.getRawType())) {
return ArrayNullSerializer.INSTANCE;
}
return super.findNullSerializer(a);
}
}
final class ArrayNullSerializer extends StdSerializer<Object> {
public static final ArrayNullSerializer INSTANCE = new ArrayNullSerializer();
protected ArrayNullSerializer() {
super(Object.class);
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray();
gen.writeEndArray();
}
}
class ListWrapper {
private List values;
public List getValues() {
return values;
}
public void setValues(List values) {
this.values = values;
}
}
上記のコードは次のように出力します。
{"values":[]}