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

2016-11-18 12:14:39 +08:00
 zeal7s
我在用 SpringMVC 时候遇到一个小问题, Google 苦搜没有找到结果。

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

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

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

我感觉是 SpringMVC 配置可能出现了问题,但是一直没找到原因。请问各位如何解决?
13219 次点击
所在节点    Java
14 条回复
daya
2016-11-18 12:22:20 +08:00
不是做 java 的,但是我看楼主的阐述,感觉这是防 XSS 的功能。
haohaozaici
2016-11-18 12:22:58 +08:00
读学校网站的 json 数据返回的也是这样,我在 android 端开发,就直接把所有 \ 去掉,再去掉首尾的 “” 。就跟正常 json 数据一样了。
jason19659
2016-11-18 12:28:53 +08:00
value 用 map 就没这问题了
jason19659
2016-11-18 12:29:41 +08:00
或者把 value 转成 json object 塞进去
fantastM
2016-11-18 13:19:45 +08:00
返回类型是 String 还是 Map
reeco
2016-11-18 13:23:02 +08:00
value 上加注解 @JsonRawValue
cs4814751
2016-11-18 13:43:36 +08:00
view 用什么模板引擎渲染的?
ecpay
2016-11-18 13:49:29 +08:00
就喜欢你们这些不转义的
chocotan
2016-11-18 13:59:24 +08:00
jstl 跟 spring 标签上都有这个属性的
zeal7s
2016-11-18 14:54:08 +08:00
@cs4814751 view 用 Google Closure Template 渲染的
ZiLong
2016-11-18 15:41:50 +08:00
感觉是你的 value 是 String 类型,设成 String 类型会有这个问题
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
2016-11-18 16:51:53 +08:00
这不是 SpringMVC 的问题,因为你 value 的类型是 String ,所以 Jackson 自然会帮你转义以保证输出后 JSON 的这个字段的类型也是 String 。
你可以把 Value 的类型设置成 JsonNode ,或者其他对象。
你也可以试试 @reeco 说的`@JsonRawValue`注解。
Infernalzero
2016-11-18 17:15:16 +08:00
首先你 message converter 用的是啥,然后这个 value 又是怎么写的?不如把那段代码贴出来容易看出问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/321451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX