Jackson
根据官方文档添加自定义序列化程序后,我观察到 json 输出格式略有不同。
此示例基于spring-restbucks。
扩展org.springsource.restbucks.WebConfiguration
并RepositoryRestMvcConfiguration
覆盖configureJacksonObjectMapper
:
@Override
protected void configureJacksonObjectMapper(ObjectMapper objectMapper) {
final SimpleSerializers serializers = new SimpleSerializers();
serializers.addSerializer(Order.class, new OrderSerializer());
objectMapper.registerModule(new SimpleModule("CustomSerializerModule"){
@Override public void setupModule(SetupContext context) {
context.addSerializers(serializers);
}
});
}
创建类org.springsource.restbucks.order.OrderSerializer
。为简洁起见,只需将属性写paid
为 JSON。
public class OrderSerializer extends JsonSerializer<Order> {
@Override
public void serialize(Order value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartObject();
jgen.writeBooleanField("paid", value.isPaid());
jgen.writeEndObject();
}
}
在添加 OrderSerializer json 响应之前,http://localhost:8080/orders/1
如下所示:
{
"location": "TAKE_AWAY",
"status": "PAYMENT_EXPECTED",
"orderedDate": "2014-03-24T15:05:09.988+01:00",
"items": [
{
"name": "Java Chip",
"quantity": 1,
"milk": "SEMI",
"size": "LARGE",
"price": {
"currency": "EUR",
"value": 4.2
}
}
],
"_links": {
...
}
}
添加 OrderSerializer json 响应后http://localhost:8080/orders/1
看起来像
{
"content": {
"paid": false
},
"_links": {
...
}
}
主要问题是属性paid 被包装到另一个对象内容中,该对象内容是org.springframework.hateoas.Resource的一个属性。我期望没有此属性的响应:
{
"paid": false,
"_links": {
...
}
}
我查看了 Jackson 代码,发现UnwrappingBeanSerializer可能是我正在寻找的解决方案。在查看了如何初始化 UnwrappingBeanSerializer 之后,我认为这个序列化器不应该被子类化以供自定义使用。
我想知道使用自定义序列化程序时这种偏离的 json 格式是正常行为还是 Spring Data Rest 中的错误。任何形式的帮助表示赞赏。