在Jackson Object Mapper中自定义字段名称序列化

时间:2014-05-30 06:27:44

标签: java jackson

说我有一个豆子:

public class MyBean {
    public String oneMississipi;
    public int myBestFriend;
    //Getters&Setters&Bears,Oh my.
}

我正在使用com.fasterxml.Jackson DataBinding将此pojo的实例转换为json输出...如何自定义字段名称的序列化,并且可以将其限定为全局/类/字段级别?

e.g。我想简化我的字段名称:

{
    "one-mississipi": "two mississippi",
    "my-best-friend": 42
}

我已经花了几个小时在Google上,甚至还在浏览杰克逊代码,以便找出字段序列化发生的位置,但似乎无法看到它可以委托进行自定义字段处理的任何地方。

有没有人对这个功能在哪里有任何想法?非常感谢

1 个答案:

答案 0 :(得分:4)

实施PropertyNamingStrategy并在解析方法中使用AnnotatedMethodAnnotatedFieldAnnotatedParameter来获取声明类。然后,您可以在该类上查找任何自定义注释,并根据它应用任何自定义注释。

这种方法的最大问题是不可能将实际的具体类序列化或反序列化,它将始终返回声明类。因此,除非将它们带入子类型,否则无法覆盖继承成员的子类型中的命名行为。

另一种解决方案是对具有不同命名策略的类使用不同的映射器。您可以通过创建顶级“路由器”映射器来使其变得更加或更不透明,该映射器将决定使用哪个映射器实例(必须特别注意配置方法和其他非ser / deser相关方法)。假设你将拥有有限数量的策略,这个解决方案也应该可行。

此解决方案的缺点是,在单个序列化/反序列化运行期间,您将无法混合使用不同的命名策略。