V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zeal7s
V2EX  ›  Java

SpringMVC 返回 JSON 引号被转义的问题

  •  
  •   zeal7s · 2016-11-18 12:14:39 +08:00 · 13201 次点击
    这是一个创建于 2708 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在用 SpringMVC 时候遇到一个小问题, Google 苦搜没有找到结果。

    SpringMVC 给 view 返回的 model 中的 value 的引号被转义了。
    model 是 ImmutableMap<String, Object>类型

    其中一个 key value pair 是这样的:
    key: "someString"
    value(JSON 格式的字符串): "{\"abc\": \"xyz\"}"

    网页上显示的并不是我想要的 Json 格式的字符串,而是将引号全部变成\&quot;

    我感觉是 SpringMVC 配置可能出现了问题,但是一直没找到原因。请问各位如何解决?
    14 条回复    2016-11-18 17:15:16 +08:00
    daya
        1
    daya  
       2016-11-18 12:22:20 +08:00 via Android
    不是做 java 的,但是我看楼主的阐述,感觉这是防 XSS 的功能。
    haohaozaici
        2
    haohaozaici  
       2016-11-18 12:22:58 +08:00
    读学校网站的 json 数据返回的也是这样,我在 android 端开发,就直接把所有 \ 去掉,再去掉首尾的 “” 。就跟正常 json 数据一样了。
    jason19659
        3
    jason19659  
       2016-11-18 12:28:53 +08:00
    value 用 map 就没这问题了
    jason19659
        4
    jason19659  
       2016-11-18 12:29:41 +08:00
    或者把 value 转成 json object 塞进去
    fantastM
        5
    fantastM  
       2016-11-18 13:19:45 +08:00
    返回类型是 String 还是 Map
    reeco
        6
    reeco  
       2016-11-18 13:23:02 +08:00
    value 上加注解 @JsonRawValue
    cs4814751
        7
    cs4814751  
       2016-11-18 13:43:36 +08:00
    view 用什么模板引擎渲染的?
    ecpay
        8
    ecpay  
       2016-11-18 13:49:29 +08:00
    就喜欢你们这些不转义的
    chocotan
        9
    chocotan  
       2016-11-18 13:59:24 +08:00
    jstl 跟 spring 标签上都有这个属性的
    zeal7s
        10
    zeal7s  
    OP
       2016-11-18 14:54:08 +08:00
    @cs4814751 view 用 Google Closure Template 渲染的
    ZiLong
        11
    ZiLong  
       2016-11-18 15:41:50 +08:00
    感觉是你的 value 是 String 类型,设成 String 类型会有这个问题
    teemoer
        12
    teemoer  
       2016-11-18 16:48:10 +08:00
    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
    <mvc:message-converters register-defaults="true">
    <!-- 将 StringHttpMessageConverter 的默认编码设为 UTF-8 -->
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
    <constructor-arg value="UTF-8" />
    </bean>
    <!-- 将 Jackson2HttpMessageConverter 的默认格式化输出设为 true -->
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="prettyPrint" value="true"/>
    </bean>
    </mvc:message-converters>
    </mvc:annotation-driven>


    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="application/json" />
    <property name="mediaTypes" >
    <value>
    json=application/json
    xml=application/xml
    </value>
    </property>
    </bean>
    swim2sun
        13
    swim2sun  
       2016-11-18 16:51:53 +08:00
    这不是 SpringMVC 的问题,因为你 value 的类型是 String ,所以 Jackson 自然会帮你转义以保证输出后 JSON 的这个字段的类型也是 String 。
    你可以把 Value 的类型设置成 JsonNode ,或者其他对象。
    你也可以试试 @reeco 说的`@JsonRawValue`注解。
    Infernalzero
        14
    Infernalzero  
       2016-11-18 17:15:16 +08:00
    首先你 message converter 用的是啥,然后这个 value 又是怎么写的?不如把那段代码贴出来容易看出问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4941 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:52 · PVG 11:52 · LAX 20:52 · JFK 23:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.