5

我有一个项目使用 Spring MVC 创建和处理多个 REST 端点。我目前正在使用 Jackson 使用@RequestBody@ResponseBody注释自动处理 JSON 的序列化/反序列化。

我已经让杰克逊工作了,所以我有了一个起点。我的问题是我们的旧序列化是手动完成的,并且使用 Pascal 大小写而不是 Camel 大小写(“MyVariable”而不是“myVariable”),而 Jackson 默认使用 Camel 大小写。

我知道我可以使用手动更改变量的名称@JsonProperty。话虽如此,我不认为添加@JsonProperty所有变量是可行的长期解决方案。

@JsonProperty除了使用注释之外,有没有办法让杰克逊在序列化和反序列化时使用 Pascal 大小写?

编辑:看起来没有一种干净的方法可以在外部执行此操作。有几个人建议重写不同的类来实现我的目标。我愿意接受关于我可以覆盖哪些内容来改变大小写的建议。目前我已经制作了一个自定义的 ObjectMapper 来设置我想要的一些属性(即Inclusion.NON_NULL)。我还没有找到任何可以让我改变套管行为的地方。有什么想法吗?

4

3 回答 3

2

请参阅http://www.cowtowncoder.com/blog/archives/2011/03/entry_448.html 如果您可以等待 1.8,它将包含在其中。

于 2011-03-16T14:51:20.637 回答
1

我最终通过覆盖(反)序列化程序解决了这个问题。对于那些感兴趣的人,您可以按照以下方式自己做:

步骤 1. 扩展BeanSerializerFactory.

覆盖_constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember)方法。在该方法中,name以您认为合适的任何方式进行修改。为了实现 Pascal 套管,我使用了这一行: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对您在 custom 中所做的参数执行相同的操作BeanSerializerFactory

步骤 3. 创建一个ObjectMapper.

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

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

于 2011-01-21T19:22:50.087 回答
0

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

于 2011-01-14T19:21:37.640 回答