json前后台传输,以及乱码中文问题探讨

摘要:
背景:我目前的工作是在不使用框架的情况下开发传统项目。最近,在处理项目时,通常需要使用ajax以json格式从后台到前台获取数据。首先,让我们谈谈我在项目中遇到的问题。前台获取数据并需要将其转换为对象。我使用jQuery。带有jquery插件的parseJSON()方法,这没有任何效果。我在浏览器中使用JSON Parse(str)也没有效果。从查询中可以看出,该方法不太支持Internet Explorer

背景介绍:

  我现在的工作是做传统项目开发,没有用到框架。最近在做项目时,经常需要使用ajax从后台拿数据到前台,是json格式的。先说下我在项目中遇到的问题吧,前台拿到了数据,需要将其转化为对象,我使用的是jquery插件带有的jQuery.parseJSON() 这个方法,没有效果,使用浏览器自带的JSON.parse(str)也是没有效果,通过查阅才知道,这个方法对于对于ie浏览器的支持并不怎么好,目前支持的是ie8(非兼容模式),ie9,等以上的版本,做传统开发的应该知道,浏览器只能用ie,无奈通过查阅得知,要想使用这个方法,需要导入一个json.js,可以从github上下载,地址:https://github.com/douglascrockford/JSON-js ,将json2.js导入到你的项目里面就好了。我没有使用这种方法,我使用的是js的eval函数。使用方法:

function test3(){
    var json = '{"name":"李四","age":"23"}';
    var $json = eval("("+json+")");
    alert(typeof($json));//object
    alert($json.name);//李四
}

上面的小例子演示eval怎么使用的。下面我们来看看对于ssm架构的项目怎么使用json数据格式传输的吧!

前提:掌握json对象和json字符串的互相转化;

  json对象——》json字符串:

    JSON.stringify(json对象);

  json字符串-——》json对象

    eval(“(”+json字符串+")")函数,$.parseJSON(json字符串),JQuery.parseJSON(json字符串),JSON.parse(json字符串);

对于json对象,取值,只需要.属性就可以了。

一、前台接受后台传输过来的json数据乱码问题

  背景:使用ssm框架

 后台:

 1 @RequestMapping("/test1")
 2     @ResponseBody
 3     public ResultInfo test1(HttpServletResponse response){
 4         ResultInfo result = new ResultInfo();
 5         result.setCode("200");
 6         result.setDesc("请求成功!");
 7         Map<String,String> map = new HashMap<String,String>();
 8         map.put("name", "求成");
 9         map.put("age","35");
10         result.setData(map);
11         return result;
12     }

前台:

 1 function test1(){
 2     $.ajax({
 3         type:'post',
 4         url:'json/test1',
 5         datatype:'josn',
 6         success:function(text){
 7             var code = text.code;
 8             var desc = text.desc;
 9             alert(code+desc);
10             var obj = text.data;
11             alert(obj.name + obj.age);
12             var str = JSON.stringify(text);
13             alert(str);
14         },
15         error:function(data){
16             alert("后台发生异常,请联系管理员!");
17         },
18         asyn:false,
19         cache:false
20     });
21 }

此时没有乱码发生,但是有时我们前台接受的text的类型有时是json对象,有时是json类型的字符串,怎么准确的判别我们从后台拿到什么类型的数据呢?这里先不说,在下面说

看第二个例子

后台:

 1 @RequestMapping(value="/test2"/*,produces="text/html;charset=UTF-8"*/)
 2     @ResponseBody
 3     public String test2(HttpServletResponse response){
 4         ResultInfo result = new ResultInfo();
 5         result.setCode("200");
 6         result.setDesc("请求成功!");
 7         Map<String,String> map = new HashMap<String,String>();
 8         map.put("name", "红霞");
 9         map.put("age","22");
10         result.setData(map);
11         String str = JSONObject.toJSONString(result);
12         System.out.println(str);
13         return str;
14     }

前台:

 1 function test2(){
 2     $.ajax({
 3         type:'post',
 4         url:'json/test2',
 5         datatype:'json',
 6         success:function(text){
 7             alert(text);
 8             alert(text.code+text.desc);
 9         },
10         error:function(text){
11             alert("后台发生异常!");
12         },
13         asyn:false,
14         cache:false 
15     });
16 }

此时前台发生了乱码,就算是设置了response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8");

这两句话也是不起作用,如果这样设置:    @RequestMapping(value="/test2",produces="text/html;charset=UTF-8") 此时是不乱码的。此时应该能够解决到所有人的遇到的中文乱码的问题!

其实归根结底来说都是消息转换器在作怪!!!

其实我们可以打开字符消息转换器来查看下。可以看出字符串转换器默认的编码式iso-8859-1

1 public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
2 
3     public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
4 
5 
6     private final List<Charset> availableCharsets;
7 
8     private boolean writeAcceptCharset = true;

后台test1:走的是MappingJackson2HttpMessageConverter这个转换器,直接将对象传回到前台。

后台test2: 走的是StringHttpMessageConverter 这个转换器,然后将字符串用iso-8859-1编码。

      自然就会出现乱码了。

我们可以通过自定义消息转换器的编码:如下

 1 <mvc:annotation-driven >
 2         <mvc:message-converters register-defaults="true">
 3             <bean class="org.springframework.http.converter.StringHttpMessageConverter" >
 4             <property name = "supportedMediaTypes">
 5                 <list>
 6                     <value>application/json;charset=utf-8</value>
 7                     <value>text/html;charset=utf-8</value>
10                 </list>
11             </property>
12             </bean>
13             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
14             </bean>
15         </mvc:message-converters>
16     </mvc:annotation-driven>

过程中,我发现个有意思的地方,对于test2(),如果把text/html放在前面,返回前台是string的json串,如果把application放在前面,返回到前台是json对象,其实不难理解,

在走StringHttpMessageConverter这个转换器的时候,会拿这个转换器里面的支持的数据类型和请求头可接受的数据类型比对,就是请求头里面的accept,如果比对成功,就不再比对下一个,所以这就可以拿捏的准前台拿到的数据是什么类型了。

总结下:

要想不乱码可有两种方法

  第一:在注解@requestMapping()里面加上:produces="text/html;charset=UTF-8"

  第二:在消息转换器里面配置上指定的编码。

免责声明:文章转载自《json前后台传输,以及乱码中文问题探讨》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇缺陷管理工具JIRA破解版及其安装方法windows系统tomcat日志输出至catalina.out配置说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

字符串包括

字符串包括 题目:如果这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出全部小字符串B 里的字母在大字符串A里都有? <<<<<<<<<<<<<<<<<<<<<<&l...

DICOM文件修改方法

/// <summary> /// 读取dicom文件 /// </summary> /// <param name="srcdirectory"></param> /// <param name="desdirectory"></param> public static void R...

C# Xml序列化与反序列化

Xml文本的序列化与反序列化: public static class XmlSerializeHelper { // 序列化:对象 -> Xml文本 public static string SerializeToXmlString(object obj) {...

JavaScript-基础知识

一、JavaScript-简介Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) JavaScript历史背景介绍 布兰登 • 艾奇(Brendan Eich,1961年~),1995年在网景公司,发明的JavaScript。 开始JavaS...

Excel中,从字符串中截取指定字符

情况一:提取字符串中的数字 目标:提取C列的全部数字 方法一:Excel中的FIND函数+MID函数   方法:想要从指定位置截取,用到MID函数。因为right和left函数都是从第一个字符或者最后一个字符开始截取,不适合。     MID语法:MID(字符串,截取开始位置,返回字符的个数)     因为截取的开始位置不统一,但是要截取的数字前面都有#...

Android 学习笔记之 JSON的序列化基本用法

最近在找怎样可以将一个数据对象通过WCF传给服务器,在网上看到了一个对象序列化成JSON的数据格式的帖子,这里整理下。 用到了JSON中的JSONStringer这个类,此类的主要功能就是可以快速的将一个数据类型序列化,成为一个标准的JSON数据。 其中需要注意的是: .object()和.endObject()必须同时使用,是为了按照Object标准给数值...