【发布时间】:2013-09-10 16:12:46
【问题描述】:
我需要以特定方式配置 Jackson,我将在下面描述。
要求
- 带注释的字段仅使用其 ID 进行序列化:
- 如果字段是普通对象,序列化其
id - 如果字段是对象的集合,则序列化
id的数组
- 如果字段是普通对象,序列化其
- 带注释的字段以不同的方式序列化其属性名称:
- 如果字段为普通对象,属性名后加
"_id"后缀 - 如果该字段是对象的集合,则在属性名称中添加
"_ids"后缀
- 如果字段为普通对象,属性名后加
- 对于注释,我想的是自定义
@JsonId之类的东西,最好有一个可选值来覆盖名称,就像@JsonProperty所做的那样 - id 属性应该由用户定义,或者使用:
- 已经存在的杰克逊
@JsonIdentityInfo - 或者通过创建另一个类或字段注释
- 或者通过决定检查哪个注释来检查
id属性的可发现性(例如,对 JPA 场景很有用)
- 已经存在的杰克逊
- 对象应使用包装的根值进行序列化
- 驼峰式命名应转换为带下划线的小写
- 所有这些都应该是可反序列化的(通过构造一个只设置了 id 的实例)
一个例子
考虑到这些 POJO:
//Inform Jackson which property is the id
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id"
)
public abstract class BaseResource{
protected Long id;
//getters and setters
}
public class Resource extends BaseResource{
private String name;
@JsonId
private SubResource subResource;
@JsonId
private List<SubResource> subResources;
//getters and setters
}
public class SubResource extends BaseResource{
private String value;
//getters and setters
}
Resource 实例的可能序列化可能是:
{
"resource":{
"id": 1,
"name": "bla",
"sub_resource_id": 2,
"sub_resource_ids": [
1,
2,
3
]
}
}
到目前为止...
-
要求#5可以通过如下方式配置
ObjectMapper来实现:objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);然后在我的 POJO 中使用
@JsonRootName("example_root_name_here")。 -
需求#6可以通过如下方式配置
ObjectMapper来实现:objectMapper.setPropertyNamingStrategy( PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
如您所见,仍有许多要求需要满足。对于那些想知道为什么我需要这样的配置的人,这是因为我正在为ember.js(更具体地说是 Ember Data)开发一个 REST Web 服务。 如果您能帮助解决任何要求,您将不胜感激。
谢谢!
【问题讨论】:
-
体验如何?我现在正面临这个要求。如果您能提供您的配置决定,我们将不胜感激。谢谢
-
您是否考虑过创建自己的
AnnotationIntrospector? -
我还必须与 ember 数据进行交互。我已经看到较新的 Jackson 版本提供了缓解这种情况的功能。你的解决方案是什么? p.s.我正在查看已批准的答案以获得洞察力。
-
@ieugen 现在我会走 JSONApi 路线并尝试 kathasis:katharsis.io Ember Data 支持开箱即用的 JSONApi 标准。
-
谢谢@miguelcobain。我在看khatarsis 。我正在使用 Vertx.io,希望我能够很好地集成它们。澄清一下:您能否确认 ember 数据与 khatarsis 集成开箱即用?
标签: java json ember.js jackson ember-data