无需额外Wrapper类为JSON POJO添加多层封装的技术问题咨询
可行实现方案
你当前使用的@XmlElementWrapper是JAXB专属的XML序列化注解,主流JSON序列化框架(如Jackson、Gson)均不识别,以下为常用实现方案(以Spring生态默认的Jackson序列化框架为例):
方案1:自定义Getter实现(零额外依赖,最通用)
将原始字段标记为忽略JSON序列化,新增虚拟属性返回嵌套结构,完全不需要冗余包装类:
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import javax.xml.bind.annotation.XmlRootElement; import java.util.Collections; import java.util.Map; @XmlRootElement @AllArgsConstructor @NoArgsConstructor public class Message { @Getter @Setter @JsonIgnore // JSON序列化时忽略原字段 private MetaParameters metaParameters; @Getter @Setter @JsonIgnore // JSON序列化时忽略原字段 private MessageParameters messageParameters; // 输出meta层级 @JsonProperty("meta") public Map<String, MetaParameters> getMetaWrapper() { return Collections.singletonMap("parameters", metaParameters); } // 输出message层级 @JsonProperty("message") public Map<String, MessageParameters> getMessageWrapper() { return Collections.singletonMap("parameters", messageParameters); } }
该方案不会影响原有XML序列化逻辑,可保留原有JAXB注解适配XML输出。
方案2:自定义字段序列化器(可复用,代码更内聚)
先实现通用的参数包装序列化器,可全局复用在所有需要加parameters包装层的字段上:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class ParameterWrapperSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); gen.writeObjectField("parameters", value); gen.writeEndObject(); } }
直接在POJO字段上引用序列化器即可:
@XmlRootElement @AllArgsConstructor @NoArgsConstructor public class Message { @Getter @Setter @JsonProperty("meta") @JsonSerialize(using = ParameterWrapperSerializer.class) private MetaParameters metaParameters; @Getter @Setter @JsonProperty("message") @JsonSerialize(using = ParameterWrapperSerializer.class) private MessageParameters messageParameters; }
适配其他序列化框架
如果你的项目使用Gson做JSON序列化,可通过@JsonAdapter注解实现相同逻辑,和自定义序列化器的思路完全一致。
内容的提问来源于stack exchange,提问作者ImStupidAndIKnowIt
相关产品推荐
相关产品推荐

