빈 배열 직렬화에 대한 Jackson null 목록
Aug 19 2020
null List를 빈 배열로 직렬화하고 싶습니다.
그래서 주어진 :
class MyBean { List values; }
값이 null 인 인스턴스가 주어지면 다음과 같이 직렬화되어야합니다.
{ "values": [] }
나는 이것이 모든 클래스의 모든 목록에 대한 전역 동작이되기를 원합니다. 클래스에 대한 주석이나 특정 처리를 추가하고 싶지 않습니다.
나는 내가 찾은 모든 관련 질문을 읽었지만 작동하는 것을 찾지 못했습니다. List 클래스에 등록하려는 사용자 지정 serializer가 시작되지 않는 것 같습니다.
프로젝트에서이 작업을 수행하고 있다면 어떻게 처리했는지 알려주세요.
답변
2 MichałZiober Aug 19 2020 at 09:48
이런 경우에는 JacksonAnnotationIntrospector
클래스 를 사용자 정의해야합니다 . Te serialize null
-s는 기본적으로 클래스를 Jackson
사용 com.fasterxml.jackson.databind.ser.std.NullSerializer
합니다. 기본 introspector 클래스를 확장하고 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":[]}