รายการค่าว่างของแจ็คสันเพื่อจัดลำดับอาร์เรย์ว่างเปล่า
ฉันต้องการจัดลำดับรายการว่างให้เป็นอาร์เรย์ว่าง
ให้:
class MyBean { List values; }
และเมื่อกำหนดอินสแตนซ์ที่มีค่า null ควรต่ออนุกรมกับ:
{ "values": [] }
ฉันต้องการให้สิ่งนี้เป็นพฤติกรรมทั่วโลกสำหรับทุกรายการในทุกชั้นเรียน ฉันไม่ต้องการเพิ่มคำอธิบายประกอบหรือการจัดการเฉพาะสำหรับชั้นเรียน
ฉันได้อ่านคำถามที่เกี่ยวข้องทั้งหมดที่พบแล้วและไม่สามารถหาข้อสรุปที่ใช้ได้ผล ดูเหมือนว่า serializer แบบกำหนดเองใด ๆ ที่ฉันพยายามลงทะเบียนสำหรับคลาสรายการจะไม่เริ่มต้น
หากคุณทำงานในโครงการของคุณโปรดแจ้งให้เราทราบว่าคุณจัดการอย่างไร
คำตอบ
ในกรณีเช่นนี้คุณต้องปรับแต่ง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":[]}