背景介绍:

  我现在的工作是做传统项目开发,没有用到框架。最近在做项目时,经常需要使用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框架

后台:

 @RequestMapping("/test1")
@ResponseBody
public ResultInfo test1(HttpServletResponse response){
ResultInfo result = new ResultInfo();
result.setCode("200");
result.setDesc("请求成功!");
Map<String,String> map = new HashMap<String,String>();
map.put("name", "求成");
map.put("age","35");
result.setData(map);
return result;
}

前台:

 function test1(){
$.ajax({
type:'post',
url:'json/test1',
datatype:'josn',
success:function(text){
var code = text.code;
var desc = text.desc;
alert(code+desc);
var obj = text.data;
alert(obj.name + obj.age);
var str = JSON.stringify(text);
alert(str);
},
error:function(data){
alert("后台发生异常,请联系管理员!");
},
asyn:false,
cache:false
});
}

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

看第二个例子

后台:

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

前台:

 function test2(){
$.ajax({
type:'post',
url:'json/test2',
datatype:'json',
success:function(text){
alert(text);
alert(text.code+text.desc);
},
error:function(text){
alert("后台发生异常!");
},
asyn:false,
cache:false
});
}

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

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

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

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

 public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

     public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

     private final List<Charset> availableCharsets;

     private boolean writeAcceptCharset = true;

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

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

      自然就会出现乱码了。

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

 <mvc:annotation-driven >
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter" >
<property name = "supportedMediaTypes">
<list>
<value>application/json;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

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

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

总结下:

要想不乱码可有两种方法

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

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

json前后台传输,以及乱码中文问题探讨的更多相关文章

  1. Android 使用JSON格式与服务器交互 中文乱码问题解决

    当前是在开发Android 程序时,客户端与服务器端采用JSON传送数据,发现中文乱码问题.不过这个问题的解决办法应该对所有java语言开发的项目都使用. 解决方法是: 1.客户端发送数据之间加上: ...

  2. fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题

    fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题. 先记下这个坑,改天在看看是怎么导致的,暂时通过避免使用Integer作为键(使用St ...

  3. 简单租房子实例详解---(session、ajax、json前后台数据处理、分页)

    本次实例我们结合session.ajax.json前后台数据处理.分页技术做一个租房信息系统 一共有五个界面:包括 管理员和用户的登录界面 登录界面的后台 <?php session_start ...

  4. Androidclient与服务端(jsp)之间json的传输与解析【附效果图附源代码】

    近期有个项目须要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,能够实现基本功能:androidclient发送json到服务端,服务端使用jsp接收,解析后以jso ...

  5. JSON取值(key是中文或者数字)方式详解

    JSON取值(key是中文或者数字)方式详解 先准备一个json对象用于演示 var json = {'name':'zhangsan', '年龄':23, 404:'你可能迷路了'}; 使用JS中w ...

  6. MySQL对JSON类型UTF-8编码导致中文乱码探讨

    前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...

  7. 关于使用Ajax请求json数据,@RequestMapping返回中文乱码的几种解决办法

    一.问题描述: 使用ajax请求json数据的时候,无论如何返回的响应编码都是ISO-8859-1类型,因为统一都是utf-8编码,导致出现返回结果中文乱码情况. $.ajax({ type:&quo ...

  8. idea ssm项目出现日志中文乱码,封装的json中的msg字段中文乱码(但是json封装的bean中的字段不乱码)等其他各种项目下的中文乱码解决方案

    开头划重点!(敲黑板):rebuild和mvn package的循环往复好几次的操作是解决这个问题的最主要的方法! 经过多次试验,发现这样做就可以正常显示中文了 我说为什么有时候乱码,有时候中文正常, ...

  9. Springmvc使用阿里巴巴的fastjson传输到前台中文乱码的解决方案,他娘的大家都少制造垃圾,学习过程将会多么快乐

    弄了大概七八个小时吧 都他妈比的抄来抄去,一分一秒的去试错 最终参考这个问题解决了乱码的情况https://bbs.csdn.net/topics/392169549 412 需要在springmvc ...

随机推荐

  1. Linux 下 -bash: mysql: command not found解决办法

    -bash: mysql: command not found 1.vim ~/.bash_profile 最下面写 export PATH=$PATH:/usr/local/mysql/bin(你的 ...

  2. Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式

    Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...

  3. js模块化方法的写法

    详细:一点点白 http://www.cnblogs.com/LoveOrHate/p/4454852.html 原始写法: function m1(){} function m2(){} 对象写法: ...

  4. 2014-08-28——Android和IOS的简单嗅探,以及横竖屏的捕获思路

    一般通过navigator.userAgent来嗅探Android系统和IOS系统: if(/android/i.test(navigator.userAgent)){ //android } if( ...

  5. PHP的文件下载

    1.通过header头部下载文件 header("Content-length: ".filesize($filename)); //指定文件下载的大小      header(' ...

  6. Windows系统Python 安装第三方模块时,提示pip版本有问题

    如果按照提示输入python -m pip install --upgrade pip 还不行, 那么执行easy_install --upgrade pip 即可 参考:https://stacko ...

  7. 【云图】怎样制作全国KTV查询系统?

    摘要:本文以[唱吧]531麦霸音乐节为案例,具体解读了怎样导入自有数据到高德云图,并进行检索和展示.最后,调起高德mobile地图来进行路线规划和周边查询. 本案例能够应用在微信开发平台,支付宝公众服 ...

  8. CentOS Linux中zip压缩和unzip解压缩命令详解

    以下命令均在/home目录下操作cd /home  #进入/home目录1.把/home目录下面的mydata目录压缩为mydata.zip     zip -r  mydata.zip   myda ...

  9. 安卓手机开机键失灵,FASTBOOT模式ADB重启

    安装ADB工具 CMD指令fastboot reboot

  10. from PyQt4.QtGui import * 提示 ImportError: DLL load failed: %1 is not a valid Win32 application.

    个人用64位电脑安装了64位的PyQt后 from PyQt4.QtGui import * 提示 ImportError: DLL load failed: %1 is not a valid Wi ...