背景介绍:

  我现在的工作是做传统项目开发,没有用到框架。最近在做项目时,经常需要使用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. 如何通过sequel pro导入.sql脚本

    1.参考地址     https://zhidao.baidu.com/question/985373253463808219.html

  2. Java手记

    由于腾讯的MTA只有JAVA的demo,为了测试用php实现的加密算法是否正确,所有只能运行一下Java 配置环境:http://www.runoob.com/java/java-environmen ...

  3. phantom的使用

    phantom页面加载 通过Phantomjs,一个网页可以被加载.分析和通过创建网页对象呈现,访问我的博客园地址:http://www.cnblogs.com/paulversion/p/83938 ...

  4. CodeIgniter框架——访问方式 URI 分配变量 数据库操作

    1.访问方式: CodeIgniter 的访问URL使用的是pathinfo,入口文件/控制器/方法(/参数列表) eg:localhost/index.php/welcome/index/id 第一 ...

  5. 1603 限高二叉排列树(计数DP)

    1603 限高二叉排列树 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   作为游戏魔方的编写者和管理员,Bob在很多主存模块中 ...

  6. Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常

    代码: @Override @Cacheable(value = CACHE_NAME, key = "'CartItemkey_'+#uId") public List<S ...

  7. linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)

    linux 传入 传出文件 swp  port  22 怎样通过swp通过docker 容器向外传文件 通过scp Linux互传文件,需要知道文件源 file source 所在系统的ip wuse ...

  8. 类加载器(ClassLoader)

    1. 类加载器概述 1.1 类加载器的作用 把 .class 文件加载到 JVM 的方法区中,变成一个 Class 对象! 1.2 类加载器分类 类加载器也是一个类: ClassLoader; Jav ...

  9. java限流(一): Semaphore

    Before obtaining an item each thread must acquire a permit from the semaphore, guaranteeing that an ...

  10. uwsgi+nginx项目上线

    一.基础环境配置 1.Linux安装配置     1.设置IP地址 [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 ...