【问题标题】:JSON getting encoded after returning from controller从控制器返回后 JSON 被编码
【发布时间】:2013-12-24 04:08:55
【问题描述】:

Spring 控制器有以下方法:

@RequestMapping(value = "reportsOverall.html")
    public/* @ResponseBody */
    ModelAndView reportsOverall(SearchParameters searchParameters) {
        searchParameters = new SearchParameters(840, "SCH_01", "PRM_07");
        System.out.println("Inside controller");
        String result = overallDetailsService
                .getOverallDetails(searchParameters);

        System.out.println("result is " + result);

        Map<String, String> model = new HashMap<String, String>();
        model.put("data", result);

        ModelAndView modelAndView = new ModelAndView("reports/reportsOverall",
                model);

        return modelAndView;

    }

我在服务器端控制台上得到了预期的输出:

result is { "_id" : { "SpId" : 840 , "Scheduler_id" : "SCH_01"} , "positive_count" : 64 , "neutral_count" : 78 , "negative_count" : 2}

但是在reportsOverall.jsp 中,当我将结果对象检索为:

function drawSentimentPieChart() {

        var data = '<c:out value="${data}"/>';
        alert(data);
            var dataJson = JSON.parse(data);

......
}

在我收到的警报中:

{ &#034;_id&#034; : { &#034;SpId&#034; : 840 , &#034;Scheduler_id&#034; : &#034;SCH_01&#034;} , &#034;positive_count&#034; : 64 , &#034;neutral_count&#034; : 78 , &#034;negative_count&#034; : 2}

空格和“”引号在这里被编码,从而导致解析失败。

spring-servlet.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <mvc:annotation-driven />
    <context:component-scan base-package="com.lnt" />

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"></bean>

    <!-- <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <array>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
                </bean>
            </array>
        </property>
    </bean> -->

    <bean id="jacksonMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <property name="basenames"
            value="classpath:userProfile,classpath:default,classpath:messages,classpath:customerAdmin,classpath:reports,classpath:superAdmin" />

        <property name="defaultEncoding" value="UTF-8" />
    </bean>

    <bean id="dateFormat" class="java.text.SimpleDateFormat">
        <constructor-arg value="yyyy-MM-dd hh:mm:ss" />
    </bean>


</beans>

我在 Spring 控制器中尝试了几件事:

使用@ResponseBody;在这种情况下,我在页面上得到了这样的转储,但页面没有正确呈现:

{"view":null,"model":{"data":"{ \"_id\" : { \"SpId\" : 840 , \"Scheduler_id\" : \"SCH_01\"} , \"positive_count\" : 64 , \"neutral_count\" : 78 , \"negative_count\" : 2}"},"empty":false,"viewName":"reports/reportsOverall","reference":true,"modelMap":{"data":"{ \"_id\" : { \"SpId\" : 840 , \"Scheduler_id\" : \"SCH_01\"} , \"positive_count\" : 64 , \"neutral_count\" : 78 , \"negative_count\" : 2}"}}

向 web.xml 添加编码过滤器:

<filter>
        <filter-name>encoding-filter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>

    </filter>

    <filter-mapping>
        <filter-name>encoding-filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

尝试使用 MappingJacksonJsonView 是徒劳的!

我忽略了什么?

【问题讨论】:

    标签: json spring-mvc servlets spring-3


    【解决方案1】:

    我遇到了同样的问题,但是这个附加属性救了我:

    <c:out value="${data}" escapeXml="false"/>
    

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多