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 json返回json的日期格式问题

当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印呈现的 JSON?

Spring mvc jackson json mapper-如何将unicode编码应用于json响应中的特殊字符

Spring MVC框架 学习笔记总结

JSON Spring Web MVC 转换:(错误:java.lang.NoSuchMethodError:org.codehaus.jackson.type.JavaType.isMapLikeT