Spring 3.1自定义JSON转换器

我使用Spring MVC 3.1,默认情况下使用Jackson进行JSON-Java转换。

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

  • java.util.List(适用于各种不同的类型)。
  • 枚举字符串
  • java.util.Calendar中
  • 我遇到了一些创建自定义转换器的不同方法:

  • 如此处所述,或多或少地创建一个自定义的ObjectMapper:

    公共类CustomObjectMapper扩展ObjectMapper ...

  • 然后将MappingJacksonHttpMessageConverter添加到我的servlet-context中,并将其注册到我的自定义ObjectMapper中:

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

  • 第二种方法讲述如何扩展FormattingConversionServiceFactoryBean并创建我自己的转换器(一个实现org.springframework.core.convert.converter.Converter的类),如下所述。
  • 更新1:我看到的另一种方法是Subcalss MappingJacksonHttpMessageConverter并重写getJavaType方法,如此处所述。 为此,我将不得不将我的自定义转换器添加到转换器列表中:

    <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,这有点不同。

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

    所以两者都有自己的位置,要定制杰克逊你会使用第一种方法,创建自定义转换器,你会使用第二种方法。

    更新:根据您提供的新信息,我认为您正在寻找的实际上是一个HttpMessageConverter而不是一个Converter。

    当你说你想要返回一个类型为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。


    在自己尝试之后,不需要列出的方法。 杰克逊(原样)能够处理嵌套集合就好,不需要定制。

    链接地址: http://www.djcxy.com/p/48811.html

    上一篇: Spring 3.1 custom JSON converters

    下一篇: How to use Jackson to deserialise an array of objects