【发布时间】:2014-07-23 11:27:47
【问题描述】:
我有一个在 Tomcat 服务器上运行的注释驱动的 Spring MVC (3.2) Java Web 应用程序。
我只是使用带有 @ResponseBody 注释的 Jackson JSON Mapper 依赖项来自动将我的模型对象映射到 json 响应。
这里是杰克逊的依赖:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.10</version>
</dependency>
这是我的模型类:
public class Person {
String name;
//other fields and getter and setter methods
}
这是控制器中响应请求的方法:
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody Person getPersonWithId(@PathVariable String id) {
//Query person from db and return the Person object
}
我的问题是,我在 Model 对象的字段中有特殊的拉丁 unicode 字符(如 Unicode Latin Capital Letter U With Diaeresis ,Ü)。名称字段包含 ğ、ş、ç、ü 等字符。我希望这些特殊字符的 unicode 等效项如下:
ğ - \u011f
ş - \u015f
ç - \u00e7 等
更具体地说,我有以下 json 响应:
{ “名称”:“ğasd” }
我想要这个
{ "名称": "\u011Fasd" }
这样做的优雅方式是什么?我找不到在杰克逊映射器中控制编码过程的方法
请注意,我已经在 web.xml 中注册了 spring 的 CharacterEncodingFilter
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
【问题讨论】:
-
所以要明确一点,您希望映射器或处理管道中的其他东西对某些 Unicode 代码点进行内联转义编码?
-
是的,正是。实际上,特殊字符列表仅限于土耳其字符,如下所示: ğ - \u011f Ğ - \u011e ı - \u0131 İ - \u0130 ö - \u00f6 Ö - \u00d6 ü - \u00fc Ü - \ u00dc ş - \u015f Ş - \u015e ç - \u00e7 Ç - \u00c7
-
您可能需要编写自己的自定义 servlet 过滤器来执行此操作。不过,这是一种奇怪的方法。为什么采用这种策略而不是标准的 UTF-8 或其他编码?
-
其实这个需求来源于客户端开发团队。他们必须在 javascript 代码中进行字母排序。他们说的是这些特殊字符 ğ、ş、ü 等使这种排序变得不可能。由于我对 javascript 的了解非常有限,因此我无法提出任何解决方法。可能你有这个问题的解决方案吗?这样我就不需要做任何事情了:)
-
您是否尝试过启用JsonGenerator.Feature.ESCAPE_NON_ASCII 功能?
标签: java json spring spring-mvc unicode