簡體   English   中英

如何在沒有嵌套的情況下使用Jackson序列化單值@Data對象(例如{“id”:123},而不是{“id”:{“value”:123}})?

[英]How to serialize single-valued @Data object using Jackson without nesting (e.g. {“id”:123}, not {“id”:{“value”:123}})?

我打算使用Lombok創建數百個基於“值對象”模式的類,如下所示:

@Data
public final class SomeId implements Serializable {
    private final long value;
}

我想將這些類用於由Jackson提供的JSON序列化。 例如,考慮如下DTO類:

public class SomeDTO {
    SomeId id;
    public SomeId getId() {
        return id;
    }
}

我希望DTO類被序列化為類似{"id":123}東西,但傑克遜產生類似{"id":{"value":123}} ,它帶有一個不必要的嵌套對象和一個名為value的字段。 即測試用例表達我的要求:

public class SomeDTOTest {
    @Test
    public void serializationTest() throws Exception {
        SomeDTO dto = new SomeDTO();
        dto.id = new SomeId(123);

        String serialized = new ObjectMapper().writeValueAsString(dto);

        System.out.println(serialized);             // {"id":{"value":123}}
        assertThat(serialized, is("{\"id\":123}")); // I want {"id":123} instead!
    }
}

我想想,把@JsonValue注釋到每一個getValue()方法SomeId類將是一個解決方案,但是因為沒有實際的定義,我不能這樣做@Data類,因為龍目島自動創建它。

@JsonValue為每個類注釋為@JsonValue實際getValue()方法可能是另一種解決方案,但它意味着創建大量的boilarplate代碼。

如果沒有樣板代碼,我該如何實現這一要求?

您可以為此類編寫自定義Serializer。

例如:

class CustomSerializer extends StdSerializer<SomeId>{

    protected CustomSerializer(Class<SomeId> t) {
        super(t);
    }

    @Override
    public void serialize(SomeId someId, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeNumber(someId.getValue()); 
    }   
}

現在使用此序列化程序來序列化SomeId類:

 ObjectMapper mapper = new ObjectMapper();

 SimpleModule module = new SimpleModule();
 module.addSerializer(new CustomSerializer(SomeId.class));       
 mapper.registerModule(module);

 SomeDTO dto = new SomeDTO();
 dto.id = new SomeId(123);     
 String serialized = mapper.writeValueAsString(dto);
 System.out.println(serialized);             // output : {"id":123}

我創建了一個getValue()接口,注釋為@JsonValue

public interface LongValue {
    @JsonValue
    long getValue();
}

然后在每個@Data類中實現它。 請注意,Lombok會自動生成getValue()實際實現:

@Data
public final class SomeId implements LongValue, Serializable {
    private final long value;
}

有了這個,我已經通過了測試SomeDTOTest - SomeDTO按照我的預期被序列化為{"id":123}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM