รายการค่าว่างของแจ็คสันเพื่อจัดลำดับอาร์เรย์ว่างเปล่า

Aug 19 2020

ฉันต้องการจัดลำดับรายการว่างให้เป็นอาร์เรย์ว่าง

ให้:

class MyBean { List values; }

และเมื่อกำหนดอินสแตนซ์ที่มีค่า null ควรต่ออนุกรมกับ:

{ "values": [] }

ฉันต้องการให้สิ่งนี้เป็นพฤติกรรมทั่วโลกสำหรับทุกรายการในทุกชั้นเรียน ฉันไม่ต้องการเพิ่มคำอธิบายประกอบหรือการจัดการเฉพาะสำหรับชั้นเรียน

ฉันได้อ่านคำถามที่เกี่ยวข้องทั้งหมดที่พบแล้วและไม่สามารถหาข้อสรุปที่ใช้ได้ผล ดูเหมือนว่า 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":[]}