背景介绍:

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

    1.批量注释:Ctrl+/ 2.缩进\不缩进:Tab\Shift+Tab 3.运行:Ctrl+Shift+F10 4.撤销\反撤销:Ctrl+z\Ctrl+shift+z 5.当光标在代码中间,如何回 ...

  2. [python数据结构] hashable, list, tuple, set, frozenset

    学习 cs212 unit4 时遇到了 tuple, list, set 同时使用的问题,并且进行了拼接.合并操作.于是我就被弄混了.所以在这里进行一下总结. hashable and unhasha ...

  3. Markov chain

    w https://en.wikipedia.org/wiki/Markov_chain https://zh.wikipedia.org/wiki/马尔科夫链 In probability theo ...

  4. Ubuntu 系统下可以做什么?

    ubuntu和windows到底有什么不同呢?从大的方面讲,它们的设计理念不同.借用一位知乎前辈说的“windows为不知道自己正在做什么的人设计,linux为知道自己要做什么,正在做什么的人设计”. ...

  5. standard pbr(三)-BRDF

    // Default BRDF to use: #if !defined (UNITY_BRDF_PBS) // allow to explicitly override BRDF in custom ...

  6. MySQL复制(一):复制的基本步骤

    从这里开始,对复制的内容开始做一些详细的描述,复制从简单到入门 复制最简单的模式如下 基本的三个简单步骤 1 配置一个服务器为master 2 配置一个服务器为slave 3 将slave连接到mas ...

  7. 剑指offer 面试46题

    面试46题: 题目:把数字翻译成字符串 题:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,……,11翻译成“1”,……,25翻译成“z”.一个数字可能有多个翻译.例如 ...

  8. 简单springmvc在Eclipse的Tomcat上部署404error,直接在Tomcat上部署可以访问

    在Eclipse工程下的.setting文件夹的org.eclipse.wst.common.component这个文件,如下则可以访问: <?xml version="1.0&quo ...

  9. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  10. 使用新浪IP库获取IP详细地址

    使用新浪IP库获取IP详细地址 <?php class Tool{ /** * 获取IP的归属地( 新浪IP库 ) * * @param $ip String IP地址:112.65.102.1 ...