Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符
Posted
技术标签:
【中文标题】Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符【英文标题】:Spring mvc jackson json mapper- How to apply unicode encoding to special characters in json response 【发布时间】: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 功能? 【参考方案1】:尝试在控制器类上方使用 spring 注释 RequestMapping 来接收所有响应中的 application/json;utf-8
@Controller
@RequestMapping(produces = "application/json; charset=UTF-8","*/*;charset=UTF-8")
public class MyController
...
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody Person getPersonWithId(@PathVariable String id)
//Query person from db and return the Person object
...
【讨论】:
以上是关于Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc json 直接把一个对象转换成json格式输出到jsp页面
当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印呈现的 JSON?
Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符
JSON Spring Web MVC 转换:(错误:java.lang.NoSuchMethodError:org.codehaus.jackson.type.JavaType.isMapLikeT