spring使用jackson实现json输出

来源:互联网 发布:网络机顶盒连接电视 编辑:程序博客网 时间:2024/05/16 06:37

原文:http://blog.chinaunix.net/uid-192452-id-3967223.html


pring的mvc 3.0和3.1处理json略有不同,用RequestMappingHandlerMapping和RequestMappingHandlerAdapter替代了原有的DefaultMethodHandlerMapping和 AnnotationMethodHandlerAdapter。
在controller里支持使用@RequestBody注解,自动将requestbody里的json字符串的entity 转换为对应的对象实例,需要增加messageconverter,默认没有MappingJackson2HttpMessageConverter, @ResponseBody对应了一系列解析器,RequestMappingHandlerAdapter的messageConverters属性,默认情况下会自动注册一堆Converter,

Converter是每种对象类型都有一个专门针对的默认情况下没有Map对应的解析器,可能会映射到MappingJackson2HttpMessageConverter,
例如如下代码

 @RequestMapping(value = "/vpnserver/status", method = RequestMethod.GET)
    @ResponseBody
    public Map status()
    {
        String retstr = "stop";
        Map<String,Object> map =new HashMap<String,Object>();
        List <String> ls =vpnConfigService.getPid(Constant.VPNSERVER_Name);
        if(ls.size()>0)
        {
          retstr = "running";
        }
        map.put("status",retstr);

        return map;

    }


加了@ResponseBody注解后,return的数据如何解析就是这个属性配置的Converter负责的。
3.1之后默认注入RequestMappingHandlerAdapter只需加上ackson-annotations-2.0.5.jar,jackson-databind-2.0.5.jar,jackson-core-2.0.5.jar。
类似的文件配置文件
<bean  
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">  
</bean>  
<bean  
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
    <property name="messageConverters">  
        <list>  
            <bean  
                class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />  
        </list>  
    </property>  
</bean>
java代码,其实不用添加
public class ApplicationContext extends WebMvcConfigurerAdapter {


。。。。。。。

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
    }

    @Bean
    MappingJackson2HttpMessageConverter converter() {
        //Set HTTP Message converter using a JSON implementation.
        MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();

        // Add supported media type returned by BI API.
        List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
        supportedMediaTypes.add(new MediaType("text", "plain"));
        supportedMediaTypes.add(new MediaType("application", "json"));
        jsonMessageConverter.setSupportedMediaTypes(supportedMediaTypes);

        return jsonMessageConverter;
    }
}
也可以使用WebMvcConfigurationSupport 代替 WebMvcConfigurerAdapter ,可以进行更多类型的定制。
处于Ajax返回json字符串的中文乱码问题
org.springframework.http.converter.StringHttpMessageConverter类是处理请求或相应字符串的类,并且默认字符集为ISO-8859-1,所以在当返回json中有中文时会出现乱码。
StringHttpMessageConverter的父类里有个List<MediaType> supportedMediaTypes属性,用来存放StringHttpMessageConverter支持需特殊处理的MediaType类型,如果需处理的MediaType类型不在supportedMediaTypes列表中,则采用默认字符集。
解决办法,只需在配置文件中加入如下代码:

<mvc:annotation-driven>
<mvc:message-converters>
 <bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
 <value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
如果需要处理其他 MediaType 类型,可在list标签中加入其他value标签


  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">    <property name="messageConverters">        <list>            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">            <property name = "supportedMediaTypes">                        <list>                            <value>apolication/json; charset=UTF-8</value>  <value>text/html;charset=UTF-8</value>                        </list>                     </property>             </bean>        </list>    </property></bean>


0 0
原创粉丝点击