我理解你的问题,你需要的是UnwrappingBeanSerializer
。你可以看到另一个相关的SO帖子:在 Spring Data Rest 中使用自定义 json 序列化器时不同的 JSON 输出 https://stackoverflow.com/questions/22613143/different-json-output-when-using-custom-json-serializer-in-spring-data-rest
问题是你不能同时拥有两个注释@JacksonUnwrapped
and @JsonSerialize
在一个领域,因为当你有@JsonSerializer
杰克逊总是会写字段名称。
这是完整的解决方案:
public class CustomSerializer extends UnwrappingBeanSerializer {
public CustomSerializer(BeanSerializerBase src, NameTransformer transformer) {
super(src, transformer);
}
@Override
public JsonSerializer<Object> unwrappingSerializer(NameTransformer transformer) {
return new CustomSerializer(this, transformer);
}
@Override
protected void serializeFields(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
A a = (A) bean;
jgen.writeStringField("custom", a.getAProp());
jgen.writeStringField("custom3", a.getAProp());
}
@Override
public boolean isUnwrappingSerializer() {
return true;
}
}
测试用例,您应该使用自定义配置或研究其他方法来重新定义对象映射器。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = Application.class)
public class ColorsTest {
ObjectMapper mapper = new ObjectMapper();
@Before
public void setUp(){
mapper.registerModule(new Module() {
@Override
public String getModuleName() {
return "my.module";
}
@Override
public Version version() {
return Version.unknownVersion();
}
@Override
public void setupModule(SetupContext context) {
context.addBeanSerializerModifier(new BeanSerializerModifier() {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
if(beanDesc.getBeanClass().equals(A.class)) {
return new CustomSerializer((BeanSerializerBase) serializer, NameTransformer.NOP);
}
return serializer;
}
});
}
});
}
@Test
public void testSerializer() throws JsonProcessingException {
System.out.println(mapper.writeValueAsString(new B()));
}
}
Class B:
public class B {
@JsonProperty("bProp")
public String getBProp() {
return "bProp";
}
@JsonUnwrapped
public A getA() {
return new A();
}
}