• Spring MVC3返回JSON数据中文乱码问题解决(转)


    Spring MVC3返回JSON数据中文乱码问题解决

    查了下网上的一些资料,感觉比较复杂,这里,我这几使用两种很简单的办法解决了中文乱码问题。

    Spring版本:3.2.2.RELEASE

    Jackson JSON版本:2.1.3

    解决思路:Controller的方法中直接通过response向网络流写入String类型的json数据。

    使用 Jackson 的 ObjectMapper 将Java对象转换为String类型的JSON数据。

    为了避免中文乱码,需要设置字符编码格式,例如:UTF-8、GBK 等。

    代码如下:

     1 import org.springframework.beans.factory.annotation.Autowired;
     2 import org.springframework.stereotype.Controller;
     3 import org.springframework.ui.Model;
     4 import org.springframework.web.bind.annotation.RequestMapping;
     5 import org.springframework.web.bind.annotation.RequestMethod;
     6 import org.springframework.web.bind.annotation.RequestParam;
     7 
     8 import com.fasterxml.jackson.databind.ObjectMapper; //Jsckson JSON Processer
     9 
    10 import java.util.*;
    11 import javax.servlet.ServletOutputStream;
    12 import javax.servlet.http.*;
    13 import java.io.PrintWriter;
    14 import java.nio.charset.Charset;
    15 
    16 /**
    17  * Created with IntelliJ IDEA 12.0
    18  * Date: 2013-03-15
    19  * Time: 16:17
    20  */
    21 @Controller
    22 public class HomeController {
    23     @RequestMapping(value="/Home/writeJson", method=RequestMethod.GET)
    24     public void writeJson(HttpServletResponse response)
    25     {
    26         ObjectMapper mapper = new ObjectMapper();
    27 
    28         HashMap<String,String> map = new HashMap<String,String>();
    29         map.put("1","张三");
    30         map.put("2","李四");
    31         map.put("3","王五");
    32         map.put("4", "Jackson");
    33 
    34         String json = "";
    35 
    36         try
    37         {
    38             json = mapper.writeValueAsString(map);
    39             System.out.println(json);
    40 
    41             //方案二
    42             ServletOutputStream os = response.getOutputStream(); //获取输出流
    43             os.write(json.getBytes(Charset.forName("GBK"))); //将json数据写入流中
    44             os.flush();
    45 
    46             //方案一
    47             response.setCharacterEncoding("UTF-8"); //设置编码格式
    48             response.setContentType("text/html");   //设置数据格式
    49             PrintWriter out = response.getWriter(); //获取写入对象
    50             out.print(json); //将json数据写入流中
    51             out.flush();
    52         }
    53         catch(Exception e)
    54         {
    55             e.printStackTrace();
    56         }
    57 
    58         //return "home";
    59     }
    60 }

     

    还有一种方法:设置 @RequestMapping 的 produces 参数,代码如下所示:

    思路:使用 @ResponseBody 注解直接返回json字符串,为了防止中文乱码,将@RequestMapping 的 produces 参数设置成"text/html;charset=UTF-8" 即可。

     1 @RequestMapping(value="/Home/writeJson", method=RequestMethod.GET, produces = "text/html;charset=UTF-8")
     2 @ResponseBody
     3 public Object writeJson(HttpServletResponse response)
     4 {
     5         ObjectMapper mapper = new ObjectMapper();
     6 
     7         HashMap<String,String> map = new HashMap<String,String>();
     8         map.put("1","张三");
     9         map.put("2","李四");
    10         map.put("3","王五");
    11         map.put("4", "Jackson");
    12 
    13         String json = "";
    14 
    15         try
    16         {
    17             json = mapper.writeValueAsString(map);
    18             System.out.println(json);
    19         }
    20         catch(Exception e)
    21         {
    22             e.printStackTrace();
    23         }
    24 
    25         return json;
    26 }

      

    运行结果如下图所示:

  • 相关阅读:
    CF 319C
    日常---区域赛临近
    poj 3728 The merchant 倍增lca求dp
    zoj 3742 Delivery 好题
    zoj 3717 Balloon 2-sat
    CF 163E. e-Government ac自动机+fail树+树状数组
    CF 335B
    hdu 4739 状压DP
    hdu 4738 桥
    Hibernate中的继承映射
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/4459750.html
Copyright © 2020-2023  润新知