在使用Spring MVC中的Jackson JSON时,如何默认启用Pascal casing?

5
我有一个项目使用Spring MVC创建和处理多个REST端点。我目前正在使用Jackson来自动处理JSON的序列化/反序列化,使用@RequestBody@ResponseBody注释。
我已经让Jackson工作了,所以我有了一个起点。我的问题是,我们旧的序列化是手动完成的,并且使用Pascal大小写而不是Camel大小写("MyVariable"而不是"myVariable"),而Jackson默认使用Camel大小写。
我知道可以使用@JsonProperty手动更改变量名称。话虽如此,我不认为将@JsonProperty添加到所有变量中是可行的长期解决方案。
除了使用@JsonProperty注释,是否有一种方法使Jackson在序列化和反序列化时使用Pascal大小写?
编辑:看起来没有一个干净的外部方法可以做到这一点。有几个人建议覆盖不同的类作为实现我的目标的方法。我可以重写哪些会改变大小写的类呢?目前,我已经制作了一个自定义ObjectMapper,设置了一些我想要的属性(即Inclusion.NON_NULL)。我还没有找到任何地方可以让我更改大小写行为。您有什么想法吗?

我不这么认为,Jackson将始终使用Java风格的名称。 - skaffman
你能否随意扩展Jackson类并以这种方式更改命名约定? - DwB
你可以覆盖一些部分(AnnotationIntrospector、BeanSerializerFactory)来实现这个目的。但是,目前还没有一个干净的外部化方式来添加命名策略(这已经被多个用户请求过了)。 - StaxMan
3个回答

2

1

我最终通过覆盖(de)serializers来解决这个问题。对于那些感兴趣的人,以下是您可以自己完成的步骤:

步骤1. 扩展BeanSerializerFactory

覆盖_constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember)方法。在该方法内部,以任何您认为合适的方式修改name。为了实现帕斯卡命名法,我使用了此行:String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1);。修改name后,调用super._constructWriter

步骤2. 扩展BeanDeserializationFactory

覆盖constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter)方法。对name参数执行与您在自定义BeanSerializerFactory中执行的相同操作。

步骤3. 创建一个ObjectMapper

将序列化工厂设置为您的自定义bean序列化工厂。设置反序列化提供程序(我使用了这行代码:objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory())))。

就是这样。您创建的ObjectMapper将在序列化或反序列化JSON时使用您的新命名方案。


0

就此而言,有一个Jira问题来支持可插拔策略;投票可能有助于说服开发人员添加支持。正如我在评论中提到的,可以覆盖内部行为,但这并不是一件简单的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接