![](/img/trans.png)
[英]Is there a generic way to deserialize single-valued value objects (without custom Deserializer) in Jackson
[英]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.