java - 杰克逊序列化简单的一个属性 ValueObject 像枚举 - 没有嵌套
问题描述
是否可以将杰克逊配置为序列化简单的值对象,只包装一个属性,像枚举一样序列化?
public final class ErrorCode {
private final String value;
public ErrorCode(@JsonProperty("value") final String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
现在它被序列化为,..., "errorCode":{"value":"invalid.login"}, ...
但我想拥有,就好像它是枚举一样..., "errorCode":"invalid.login", ...
。可以但只能通过每个周围类中的@JsonUnwrapped()
SorroundingClass {
@JsonUnwrapped()
private ErrorCode errorCode;
...
}
我只想在一个地方配置它,最好在 ErrorCode 本身。
看着flattening-nested-attributes-in-jackson在我看来这是不可能的,但我想确定一下。
解决方案
您可以通过实现自定义com.fasterxml.jackson.databind.JsonSerializer
序列化程序来实现这一点:
class SingleValueJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value == null) {
gen.writeNull();
return;
}
final Field[] fields = value.getClass().getDeclaredFields();
if (fields.length != 1) {
throw new IOException("Do not use this serialiser for the class " + value.getClass().getSimpleName() + " which has" + fields.length + " fields!");
}
final Field first = fields[0];
try {
final Object fieldValue = first.get(value);
gen.writeObject(fieldValue);
} catch (IllegalAccessException e) {
throw new IOException(e);
}
}
}
您可以在所需的类中定义它:
class Wrapper {
@JsonSerialize(using = SingleValueJsonSerializer.class)
private ErrorCode error;
// other fields
}
或通过在类级别上定义来全局注册它:
@JsonSerialize(using = SingleValueJsonSerializer.class)
class ErrorCode {
推荐阅读
- php - MySQL 用于选择两列的最大差异
- javascript - Why WebGL build disables Mouse Wheel Scroll on webpage?
- wso2 - WSO2 API 管理器 - 发布 API 在技术上是如何工作的?
- c - Communication between processes - pipe and fifo
- r - 使用耦合列从宽到长:是否有更多 R 方法来做到这一点(即 - 不使用 for 循环)?
- javascript - 如何检查地图功能是否完成
- sparql - 用于查找源自美国并在美国发行的电影的 SPARQL 查询
- api - TransactionSearch paypal API deprecated
- android - 如何从选定的 mp3 文件中提取信息?
- rx-java2 - 如何处理 List 中的所有项目,然后用 RxJava 完成