json - Spring 3.1 自定义 JSON 转换器

标签 json spring-mvc jackson

我使用的是 Spring MVC 3.1,它默认使用 Jackson 进行 JSON-Java 转换。

我需要为以下内容创建自定义转化:

  1. java.util.List(用于各种不同的类型)。
  2. 枚举到字符串
  3. java.util.日历

我在创建自定义转换器时遇到过几种不同的方法:

  1. 如所述here或多或少,创建一个自定义的 ObjectMapper:

    公共(public)类 CustomObjectMapper 扩展了 ObjectMapper...

然后将 MappingJacksonHttpMessageConverter 添加到我的 servlet 上下文并将其注册到我的自定义 ObjectMapper:

然后我想我需要在我的自定义 objectMapper 中有一些特定的实现(它应该是什么样子?)。

  1. 第二种方法讨论了如何扩展 FormattingConversionServiceFactoryBean 并创建我自己的转换器(一个实现 org.springframework.core.convert.converter.Converter 的类),如 here 所述。 .

更新 1: 我见过的另一种方法是子调用 MappingJacksonHttpMessageConverter 并覆盖 getJavaType 方法,如所述 here .为此,我必须将我的自定义转换器添加到转换器列表中:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
    <list>
        <bean class="com.yl.app.CustomMappingJacksonHttpMessageConverter">
    </list>
</property>

推荐哪种方法?只有这些吗,还有更好的方法吗?

更新 2:

我还是不明白。实际上,假设我有 A 类和 B 类。

A 类持有 B 的列表:

public class A {

   public List<B> list;

}

我想返回一个 A 类型的对象给我的客户。除了添加 @ResponseBody 注释(据我所知,在这种情况下这还不够),我还应该在我的服务器中做什么?

最佳答案

这两种方法有不同的用途:

您概述的第一种方法是自定义 Jackson ObjectMapper - 例如,在 json 中以不同格式显示日期或注册自定义序列化程序以稍微不同地处理类到 json 的映射。

第二种方法是注册转换器 - 将一个对象转换为另一个对象,例如,将一个字符串请求参数从 UI 转换为一个对象,或者说如果您获得字段的实体 ID 并想要转换它一个实体。

所以两者都有它们的位置,要自定义 Jackson,您可以使用第一种方法,要创建自定义转换器,您可以使用第二种方法。

更新: 根据您提供的新信息,我认为您要找的实际上是一个 HttpMessageConverter不是转换器。

当你说你想将类型 A 的对象返回给你的客户端时,你会通过网络以某种方式将它序列化 - 通常是 json 或 xml,但也可能是其他格式 - 如果你要将它转换为 json 那么您基本上自定义 ObjectMapper 底层 MappingJacksonHttpMessageConverter(使用 Jackson 1.x)或 MappingJackson2HttpMessageConverter(使用 Jackson2.x)您通常会这样做:

<mvc:annotation-driven conversion-service="conversionService"> 
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.bk.lmt.web.spring.CustomObjectMapper"/>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

如果您想自定义 Json 表示,则在自定义对象映射器中注册适当的序列化器/反序列化器。

与 XML 类似,您通常不会编写自己的转换器(Jaxb2RootElementHttpMessageConverter),而是使用 XmlJavaAdapters 来自定义某些元素的序列化方式。

如果您有一些新的序列化格式(不是 xml、json),那么是的,您可以尝试从头开始编写 HttpMessageConverter。

关于json - Spring 3.1 自定义 JSON 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571491/

相关文章:

c# - 使用 JSON.net 获取 JToken 的名称/ key

java - Spring mvc - 如何将所有错误的请求映射映射到单个方法

java - 如何在validation-text.properties 文件中使用通配符?

java - jackson 在数组中展开对象

java - JsonMappingException : No suitable constructor found for type [simple type, 类 car.Car$Parts]

java - Recyclerview 内存不足错误(使用 Volley)

java - 空指针异常 : uriString

json - jackson 反序列化自定义 boolean json 属性

android - JSON Android 解析JSONArray

spring-mvc - Spring 启动+JDBC+HSQLDB : How to Verify if Spring Boot is using a Connection Pool?