ajax与json实战


目录:(Ctrl+F进行检索)
1.javascript中底层的ajax异步请求后台操作的方法与实例。
2.jquery对ajax的各种操作方法
3.ajax详解
4.json详解
5.java中对json的处理。
6.java将json数据传值前台。
7.jsp前台对json进行处理。
8.ajax异步获取到后台的json并进行处理。
--------------------------------------------
1.传统的 ajax异步请求后台操作的方法。
特点:javascript中的局部刷新,异步交互。

传统的写法:

 1 <script type="text/javascript">
 2     function createXMLHttpRequest() {//为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。
 3         //如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject :
 4         //第一步创建XMLHttpRequest()
 5         try {
 6             xmlHttp = new XMLHttpRequest();
 7         } catch (tryMS) {
 8             try {
 9                 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
10             } catch (otherMS) {
11                 try {
12                     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
13                 } catch (failed) {
14                     xmlHttp = null;
15                     // 这里可以报一个错误,无法获得 XMLHttpRequest对象    
16                 }
17             }
18         }
19         return xmlHttp;
20     }
21     window.onload = function() {
22         document.getElementById("b1").onclick = function() {
23             //调用AJAX发送请求
24             /**
25              * 1.创建xmlHttpRequest对象
26              * 2.绑定回调函数
27              * 3.与服务器建立连接
28              * 4.发送数据
29              * 5.回调函数处理相应的数据
30              */
31             //第一步:创建XMLHttpRequest对象,往上看怎么验证浏览器支持的↑
32             var xmlHttp = createXMLHttpRequest();
33 
34             //第二步:绑定回调函数
35 
36             xmlHttp.onreadystatechange = function() {
37                 if (xmlHttp.readyState == 4) {
38                     //表示readyState的状态已经在第四步,数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据,
39                     //ajax readyState的五种状态详解请看这篇。传送门:http://www.jb51.net/article/16966.htm
40                     if (xmlHttp.status == 200) {//http状态码为200表示正常交互完成。
41                         //两步都验证过了则可以设置回调函数
42                         var callback = xmlHttp.responseText;
43                         //如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
44                         //responseText是获得字符串形式的响应数据。responseXML则获得 XML 形式的响应数据。
45                         document.getElementById("myDiv").innerHTML = callback;//这里就可以预设值对回调函数的处理。比如这里把回调函数展示到 id为myDiv的标签中。
46                     }
47                 }
48             }
49             //第三步:与服务器建立连接
50             xmlHttp.open("POST", "../servlet/AjaxServlet", true);
51             //第一个参数是请求的类型,get或者post,但是get会取得缓存的数据,get携带数据量有限,get对大量未知字符输入时不稳定,有以上三点障碍时,请选择POST;
52             //第二个参数是请求的地址url,这个 地址可以请求任何类型的文件如.txt .xml 或者是.js ,为了防止虚拟路径问题,建议使用el表达式动态获取地址,把url修改为:“${pageContext.request.contextPath}/servlet/AjaxServlet”。再者,如果担心get请求取得了缓存数据,可以让地址每次都不一样就获取不到缓存了,比如这样写:“${pageContext.request.contextPath}/servlet/AjaxServlet?t=”+Math.random()。
53             //第三个参数是设置async 参数,true为异步请求,false为同步请求,false请求时会导致浏览器锁住,等数据处理完才能操作页面。而且,当您使用 async=false 时,请不要编写 onreadystatechange 函数,把代码放到 send() 语句后面即可。就是说上面的document.getElementById("myDiv").innerHTML=callback;把这一段放到send后面。
54             //第四步:向服务器发送请求
55             xmlHttp.setRequestHeader("CONTENT-TYPE",
56                     "application/x-www-form-urlencoded");//向请求添加 HTTP 头。可以添加多个。自行百度。
57             xmlHttp.send("name=张三");//send中的string是在请求正文里,只在post的时候用,get的话就空着,因为例子是post请求的数据,所以这里写了一个例子。
58         }
59     }
60 </script>

底层ajax案例:
案例1:底层ajax用get获取.txt文件
txt文件放在WebRoot文件夹内,.txt内容为:

1 <p id="txt1" style="color:red">woshi yiduan txt wenben !</p>
2 <p id="txt2">woshi dier duan txt wenben !</p>

 

js代码:

  

 1 <script type="text/javascript">
 2     function createXMLHttpRequest() {
 3         try {
 4             xmlHttp = new XMLHttpRequest();
 5         } catch (tryMS) {
 6             try {
 7                 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
 8             } catch (otherMS) {
 9                 try {
10                     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
11                 } catch (failed) {
12                     xmlHttp = null;
13                     // 这里可以报一个错误,无法获得 XMLHttpRequest对象    
14                 }
15             }
16         }
17         return xmlHttp;
18     }
19     window.onload = function() {
20         document.getElementById("bt1").onclick = function() {
21             var xmlHttp = createXMLHttpRequest();
22             xmlHttp.onreadystatechange = function() {
23                 if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
24                     document.getElementById("myDiv").innerHTML = xmlHttp.responseText;
25                 }
26             }
27 
28             xmlHttp.open("GET",
29                     "${pageContext.request.contextPath}/test/test.txt?t="
30                             + Math.random(), true);
31 
32             xmlHttp.setRequestHeader("CONTENT-TYPE",
33                     "application/x-www-form-urlencoded");
34             xmlHttp.send();
35         }
36     }
37 </script>
38 
39 
40 </head>
41 
42 <body>
43 
44     <div id="myDiv">
45         <h2>通过 AJAX 改变文本</h2>
46     </div>
47     <button id="bt1">改变内容</button>
48 
49 </body>

 

展示结果:

  

说明:

  内容怎么会有颜色变化呢?因为,responseText属性包含了从服务器返回的文字信息。这些信息其实就是所请求的页面,我们的xmlHttp.responseText是可以自动识别标签,所以我们也可以根据标签或者属性进行部分取值,自己百度研究。 

  这里要注意的是,一个正常页面是有格式要求的,一旦不符合标签规范,就会引发“未知运行期错误”,假设文本中包含<html></html>标签,你想想<div></div>标签中能嵌套<html></html>标签吗?

  还有一个中文乱码问题!为啥我txt不用中文要写拼音,因为我英语不好,呸!因为我还不会处理中文乱码 o(╥﹏╥)o,有大神会的评论里稍稍指点一下呗,或者给个传送门。

------------------- 

案例2:底层ajax获取xml文件;

  了解一下xml先,xml不知道怎么操作的话,学什么ajax,滚回去复习基础!

  简单概括:

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML,但不是HTML的替代。
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。就是说可以自己发明标签
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。
  • XML仅仅是纯文本。
  • XML无所不在。

  摘自w3school.com;

准备xml文件,比如:test.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <CATALOG>
 3 <CD>
 4 <TITLE>Empire Burlesque</TITLE>
 5 <ARTIST>Bob Dylan</ARTIST>
 6 <COUNTRY>USA</COUNTRY>
 7 <COMPANY>Columbia</COMPANY>
 8 <PRICE>10.90</PRICE>
 9 <YEAR>1985</YEAR>
10 </CD>
11 <CD>
12 <TITLE>Hide your heart</TITLE>
13 <ARTIST>Bonnie Tyler</ARTIST>
14 <COUNTRY>UK</COUNTRY>
15 <COMPANY>CBS Records</COMPANY>
16 <PRICE>9.90</PRICE>
17 <YEAR>1988</YEAR>
18 </CD>
19 <CD>
20 <TITLE>Greatest Hits</TITLE>
21 <ARTIST>Dolly Parton</ARTIST>
22 <COUNTRY>USA</COUNTRY>
23 <COMPANY>RCA</COMPANY>
24 <PRICE>9.90</PRICE>
25 <YEAR>1982</YEAR>
26 </CD>
27 <CD>
28 <TITLE>Still got the blues</TITLE>
29 <ARTIST>Gary Moore</ARTIST>
30 <COUNTRY>UK</COUNTRY>
31 <COMPANY>Virgin records</COMPANY>
32 <PRICE>10.20</PRICE>
33 <YEAR>1990</YEAR>
34 </CD>
35 <CD>
36 <TITLE>Eros</TITLE>
37 <ARTIST>Eros Ramazzotti</ARTIST>
38 <COUNTRY>EU</COUNTRY>
39 <COMPANY>BMG</COMPANY>
40 <PRICE>9.90</PRICE>
41 <YEAR>1997</YEAR>
42 </CD>
43 </CATALOG>

 

javascript代码:

 1 <script type="text/javascript">
 2     window.onload = function() {
 3         document.getElementById("bt1").onclick = function() {
 4             var xmlHttp; 
 5             if (window.XMLHttpRequest)
 6               {// code for IE7+, Firefox, Chrome, Opera, Safari
 7               xmlHttp=new XMLHttpRequest();
 8               }
 9             else
10               {// code for IE6, IE5
11               xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
12               }
13             xmlHttp.onreadystatechange = function() {
14                 if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
15                     xmlDoc=xmlHttp.responseXML;
16 
17                     document.write("<table border='1'>");
18                     var x=xmlDoc.getElementsByTagName("CD");
19                     for (i=0;i<x.length;i++)
20                       {
21                       document.write("<tr><td>");
22                       document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
23                       document.write("</td><td>");
24                       document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
25                       document.write("</td></tr>");
26                       }
27                     document.write("</table>");
28                     
29                 }
30             }
31 
32             xmlHttp.open("GET",
33                     "${pageContext.request.contextPath}/test/test.xml?t="
34                             + Math.random(), true);
35 
36             xmlHttp.setRequestHeader("CONTENT-TYPE",
37                     "application/x-www-form-urlencoded");
38             xmlHttp.send();
39         }
40     }
41 </script>
42 
43 
44 </head>
45 
46 <body>
47 
48     <div id="myDiv">
49         <h2>通过 AJAX 改变文本</h2>
50     </div>
51     <button id="bt1">改变内容</button>
52 
53 </body>

 

执行结果:

  

说明:

  xml编辑成HTML真的很麻烦啊很麻烦,,回调函数里写了一堆就是处理xml数据的东西,说技术含量也没什么技术含量,细心就可以了,码农啊!码农。

   验证浏览器的部分怎么和之前不一样了呢?这样写也是可以的啦!try-catch当然 更高级了,但是谁去写啊,复制就行,都一样!

-----------------------------------------------

3.jquery的ajax异步请求。

说明:

  jQuery 提供多个与 AJAX 有关的方法。

  通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中。

  提示:如果没有 jQuery,AJAX 编程还是有些难度的。

  编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现并不相同。这意味着您必须编写额外的代码对浏览器进行测试。不过,jQuery 团队为我们解决了这个难题,我们只需要一行简单的代码,就可以实现 AJAX 功能。

前提:

  引入jquery.js:
  <script type="text/javascript" src="http://libs.cdnjs.net/jquery/3.2.1/jquery.js"></script>
  这是前端公共库CDN加速的远程仓库,当然也可以下载相关js文件然后引入,但必须是1.4以上的版本。以前的版本几乎没人用了,不知道会出现什么诡异的问题。

  学习jquery技术。查着用着也行。

案例1:最简单的jquery load()方法

  准备.txt文本,如:test.txt;

  

1 <p id="txt1" style="color:red">woshi yiduan txt wenben !</p>
2 <p id="txt2" style="color:green">woshi dier duan txt wenben !</p>

 

jsp中的jquery代码:

  

 1 <script type="text/javascript">
 2     $().ready(function(){
 3         $("#bt1").click(function(){
 4             $("h2").load("./test/test.txt");
 5         });
 6     });
 7 </script>
 8 </head>
 9 <body>
10     <div id="myDiv">
11         <h2>通过 AJAX 改变文本</h2>
12     </div>
13     <button id="bt1">改变内容</button>
14 </body>

 

执行结果:

 

 

 说明:

  

该方法是最简单的从服务器获取数据的方法。它几乎与 $.get(url, data, success) 等价,不同的是它不是全局函数,并且它拥有隐式的回调函数。当侦测到成功的响应时(比如,当 textStatus 为 "success" 或 "notmodified" 时),.load() 将匹配元素的 HTML 内容设置为返回的数据。这意味着该方法的大多数使用会非常简单:

 就是说如果$()里面的"h2"如果没有这个标签就不会执行,

 并且如果使用的是数据的对象,就使用POST方法,否则就使用get方法。

 

 案例2:

  我们可以把 jQuery 选择器添加到 URL 参数。
  把 "test.txt" 文件中 id="txt2" 的元素的内容,加载到指定的元素中。

准备.txt文本,同上。

准备jsp中的jquery代码:

     

 1 <script type="text/javascript">
 2     $().ready(function(){
 3         $("#bt1").click(function(){
 4             $("h2").load("${pageContext.request.contextPath}/test/test.txt #txt2");
 5         });
 6     });
 7 </script>
 8 </head>
 9 <body>
10     <div id="myDiv">
11         <h2>通过 AJAX 改变文本</h2>
12     </div>
13     <button id="bt1">改变内容</button>
14 </body>

 

 执行结果取到了想要的数据:

  

 说明:

  没啥说的。

---------------------------------

案例 3:ajax的$.load()方法获取并设置xml文档。

 准备.xml文档: 如:test.xml:

  

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <CATALOG>
 3 <CD>
 4 <TITLE>Empire Burlesque</TITLE>
 5 <ARTIST>Bob Dylan</ARTIST>
 6 <COUNTRY>USA</COUNTRY>
 7 <COMPANY>Columbia</COMPANY>
 8 <PRICE>10.90</PRICE>
 9 <YEAR>1985</YEAR>
10 </CD>
11 <CD>
12 <TITLE>Hide your heart</TITLE>
13 <ARTIST>Bonnie Tyler</ARTIST>
14 <COUNTRY>UK</COUNTRY>
15 <COMPANY>CBS Records</COMPANY>
16 <PRICE>9.90</PRICE>
17 <YEAR>1988</YEAR>
18 </CD>
19 <CD>
20 <TITLE>Greatest Hits</TITLE>
21 <ARTIST>Dolly Parton</ARTIST>
22 <COUNTRY>USA</COUNTRY>
23 <COMPANY>RCA</COMPANY>
24 <PRICE>9.90</PRICE>
25 <YEAR>1982</YEAR>
26 </CD>
27 <CD>
28 <TITLE>Still got the blues</TITLE>
29 <ARTIST>Gary Moore</ARTIST>
30 <COUNTRY>UK</COUNTRY>
31 <COMPANY>Virgin records</COMPANY>
32 <PRICE>10.20</PRICE>
33 <YEAR>1990</YEAR>
34 </CD>
35 <CD>
36 <TITLE>Eros</TITLE>
37 <ARTIST>Eros Ramazzotti</ARTIST>
38 <COUNTRY>EU</COUNTRY>
39 <COMPANY>BMG</COMPANY>
40 <PRICE>9.90</PRICE>
41 <YEAR>1997</YEAR>
42 </CD>
43 </CATALOG>

 

 准备jsp中的jquery代码:

  

 1 <script type="text/javascript">
 2     $().ready(function(){
 3         $("#bt1").click(function(){
 4             $("#myDiv").load("${pageContext.request.contextPath}/test/test.xml",function(response,status,xhr){
 5                       if (status=="success"){
 6                           $("div").html("<ol></ol>");
 7                           $(response).find("artist").each(function(){
 8                             var item_text = $(this).text();
 9                             $('<li></li>').html(item_text).appendTo('ol');
10                             });
11                        }
12             });
13         });
14     });
15     
16 </script>
17 </head>
18 <body>
19     <div id="myDiv">
20         <h2>通过 AJAX 改变文本</h2>
21     </div>
22     <button id="bt1">改变内容</button>
23 </body>

 

展示结果:

  

 

 说明:

  jquery操作起来是不是 看着简单点了。其实我弄了三个小时才搞好!原因是$.load("url",function(response,status,xhr){}),就是这个回调函数中的xhr,xhr代表XMLHttpRequest对象,我一直试图使用这个用DOM来处理xml文档,进行table的展示,结果一直报Cannot read property 'getElementsByTagName' of undefined  错误,实在忍无可忍,就放弃了。。。哈哈,哪位大神能用 xhr处理一下,贴评论里我看看呗,谢谢了。

  $().load()里还有一个参数是data, 就是同ajax请求过去的参数,后台做选择判断,这个没啥说的吧。。。

  额,说一下吧,就是这种格式   {"name":"小猪佩奇","age":"4"},

  数据使用的POST 形式发送的附加参数里,

 ajax案例:jquery中的$.ajax()方法

 案例1:简单的$.ajax()读取.txt文档。

 说明:看懂了上面的$().load()方法的话,这个应该就容易理解一些了。

准备.txt 文本,同上

准备jsp中的代码:

  

 1 <script type="text/javascript">
 2 $(document).ready(function(){
 3   $("#bt1").click(function(){
 4   htmlobj=$.ajax({url:"${pageContext.request.contextPath}/test/test.txt",async:false});
 5   $("#myDiv").html(htmlobj.responseText);
 6   });
 7 });
 8 </script>
 9 </head>
10 <body>
11     <div id="myDiv">
12         <h2>通过 AJAX 改变文本</h2>
13     </div>
14     <button id="bt1">改变内容</button>
15 </body>

 

 执行结果:

  

说明:

  这是一个简单的ajax请求,但是ajax的[settings]里的async参数要设置成false同步请求才能这样操作上面的文本。那ajax就没什么用了?

 $.ajax()中有非常多的参数,组成了一个settings,翻译过来就算作配置文件,这样更好理解一些,

要认识这些参数,我们可以看官方文档,传送门:http://www.w3school.com.cn/jquery/ajax_ajax.asp;

我们也可以看大神更直接的解释,传送门:http://blog.csdn.net/qq_27093465/article/details/49799341;

里面最难理解的算是options参数,这个跨域请求的东西要在实战中体会,我自己也不太理解。但并不影响我们今天研究和核心。我们略过。

下面我们看一个例子,简单的ajax异步请求,要怎么写:

案例2:ajax设置settings参数进行异步请求逻辑处理

准备前台jsp:

  

 1 <script type="text/javascript">
 2 $(document).ready(function(){
 3   $("#bt1").click(function(){
 4   $.ajax({
 5       url:"${pageContext.request.contextPath}/ajaxtes?t="+Math.random(),
 6       data:{username:"海绵宝宝"},
 7       success:function(say){
 8           $("h2").text(say);
 9       }
10   });
11   });
12 });
13 </script>
14 </head>
15 <body>
16     <div id="myDiv">
17         <h2>通过 AJAX 改变文本</h2>
18     </div>
19     <button id="bt1">改变内容</button>
20 </body>

 

准备java后台数据:

  

 1 public class ajaxtes extends HttpServlet {
 2 
 3     public void doGet(HttpServletRequest request, HttpServletResponse response)
 4             throws ServletException, IOException {
 5         response.setContentType("text/html;charset=utf-8");//处理响应乱码
 6         String username = request.getParameter("username");//手动编解码处理乱码
 7         byte[] bytes = username.getBytes("iso8859-1");
 8         username = new String(bytes,"utf-8");
 9         if(username.equals("海绵宝宝")){
10             response.getWriter().print("我是一串密码");
11         }else{
12             response.getWriter().print("用户名不存在,不告诉你密码");
13         }
14         
15     }
16 
17     public void doPost(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         doGet(request, response);
20     }
21 
22 }

 

执行结果:

 

因为ajax参数中的async参数默认是true异步请求,可以不用写,type默认是get请求,也不用写, data就会被默认追加在url后面,形成上面那样,当然中间做了一些乱码处理,这都是小事情。

从这上面我们可以看出,我们使用jquery中的ajax方法可以很简单的实现ajax异步请求的处理。当然还有好几个ajax方法比如$.get 或者$.post,这都属于上层的代码了,写法更为简单易懂。

互联网上还有很多变种的ajax,可以自行学习研究,比如中国的前端框架validform,也做了一些ajax的处理,但是底层还是与我们这些代码息息相关。

----------------------------------------

  

---------------------------------
2.json
  说明:JSON是一种数据交互的格式.
数据的交互格式:
  1.xml
    标签是成对出现的
    xml中的格式对对固定,不允许修改.
    如果对于数据要求较为严格时,首选xml(报文)
  2.JSON
    JSON是一种轻量级的数据交互格式.
    在传输过程中,只需要传递有效信息.
    对于数据要求相对宽松,并且传递速度较快时.


JSON格式说明:
  array数组格式:
    ["value1","value2","value3"]

  Object对象格式:
    {"id":"1","name":"tom"}
  复杂格式:
    A:["value1","value2",{"id":1,"name":"tom"}]
    B:[{id:"1",name:"tom"},{id:2,name:"jerry"},{id:3,name:"herry"}]


语法:

  如果value值是数字。可以不加""号,如果value值是字符,必须加""号,对于key而言,(注意是key!就是对象格式!),加不加""号都可以。
以上JSON格式要牢记!牢记!牢记!重要的事情说三遍。实在记不住,就都加上引号!
-------------------------
3.java中数据转json格式的方法
第一种:String类型

  我们可以直接按着json格式写出一个字符串,这这个字符串就是json。
  如:String json = {"book1":[{"yema":"12","neirong":"文绉绉"},{"页码":"22","neirong":"侠客片段"}],"book2":[{"页码":"1","内容":"爱情片段"},{"页码":"5","neirong":"恐怖片段"}]};

  但是!直接这样写在java里是不行的,因为""会编译错误,需要用\号对每个“号进行转义,

  这里有一个网站可以快速转义,传送门:http://www.sojson.com/yasuo.html; 
在转义后是这样的:
  String json="{\"book1\":[{\"yema\":\"12\",\"neirong\":\"文绉绉\"},{\"页码\":\"22\",\"neirong\":\"侠客片段\"}],\"book2\":[{\"页码\":\"1\",\"内容\":\"爱情片段\"},{\"页码\":\"5\",\"neirong\":\"恐怖片段\"}]}";
看。这一段放在java中就没问题了。在编译后\斜杠会自动为"双引号进行转义后会显示成一个正常的json串。

 

第二种:数组类型

  我们可以使用json-lib的jar包,把其他格式轻松的转换为json串,jar包可以自行下载,我使用的是这些:

  

 java数组转json串:

1     String[] str={"张三","李四","王五","赵六"};
2     System.out.println(Arrays.toString(str));
3     //将数组转化成json串
4     JSONArray json = JSONArray.fromObject(str);
5     System.out.println(json);

 执行结果:

  

可以看出,这里我们已经成功的转出了json串,格式也是符合json要求的。

 

第三种:集合类型

  java集合转json串:

    

1         List<String> list = new ArrayList<String>();
2         list.add("一");
3         list.add("二");
4         list.add("三");
5         list.add("四");
6         System.out.println(list);
7         //将List转换为json串
8         JSONArray json = JSONArray.fromObject(list);
9         System.out.println(json);

 

 执行结果:

  

可见转换的格式也符合了json串的要求。

 

第四种:map类型:

  java中map代码

1         Map<String, Object> map = new HashMap<String, Object>();
2         map.put("name", "张三");
3         map.put("age", "18");
4         map.put("gender", "男");
5         map.put("job", "程序猿");
6         System.out.println(map);
7         //map转json串
8         JSONObject json = JSONObject.fromObject(map);
9         System.out.println(json);

 

  执行结果:

  

成功。

 第五种,对象转json

java代码:

   

 1 User user = new User();
 2         user.setUsername("张三");
 3         user.setPassword("123");
 4         user.setAge(12);
 5         user.setGender("男");
 6         user.setJob("程序猿");
 7         System.out.println(user);
 8         //对象转json串
 9         JSONObject json = JSONObject.fromObject(user);
10         System.out.println(json);

 

 执行结果:

神奇不神奇?

当然我们还可以针对某个元素进行转化。如

------------------------------------------------------------

json串转对象的方法:

  java代码:

    

1         String json = "{\"age\":12,\"gender\":\"男\",\"job\":\"程序猿\",\"password\":\"123\",\"username\":\"张三\"}";
2         JSONObject fromObject = JSONObject.fromObject(json);
3         User user = (User)JSONObject.toBean(fromObject, User.class);
4         System.out.println(user);
5         System.out.println(user.getAge());

 

  执行结果:

  

看,对象数据已经封装进去了。

 ----------------------------------------------------------------

我们先在jsp上做一个简单的json操作,

案例1:解析json对象类型

  准备jsp内容:

  

 1 <script type="text/javascript">
 2 $().ready(function(){
 3     var jsonObject = {"name":"pxf","age":"22","address":"beijing","photo":"12356"};
 4     $("#jname").html(jsonObject.name);
 5     $("#jage").html(jsonObject.age);
 6     $("#jstreet").html(jsonObject.address);
 7     $("#jphone").html(jsonObject.photo);
 8 }); 
 9 </script>
10 </head>
11 <body>
12 <h2>在 JavaScript 中创建 JSON 对象</h2>
13 
14 <p>
15 Name: <span id="jname"></span><br />
16 Age: <span id="jage"></span><br />
17 Address: <span id="jstreet"></span><br />
18 Phone: <span id="jphone"></span><br />
19 </p>
20 </body>

 

展示结果:

  

 

看,js能很容易的解析出对象类型的json,因为json的写法和js对象的写法是一模一样的。

案例2: 解析json数组类型:

  准备jsp页面:

    

1 <script type="text/javascript">
2 $().ready(function(){
3     var jsonArray=["pxf","22","beijing","12355"];
4     $("#jname").html(jsonArray[0]);
5     $("#jage").html(jsonArray[1]);
6     $("#jstreet").html(jsonArray[2]);
7     $("#jphone").html(jsonArray[3]);
8 }); 
9 </script>

 

  执行结果:

  

执行成功。

案例3:将json文本转化为jquery对象。

  这是最重要的了,我们所学json的目的就是讲服务器传送的json转换成js对象。

  我们做一个json的字符串作为模拟后台传来的json字符串。

  准备jsp页面:

  

 1 <script type="text/javascript">
 2     $().ready(
 3         function() {
 4             var txt = '{ "employees" : [{ "firstName":"Bill" , "lastName":"Gates" },'
 5                     + '{ "firstName":"George" , "lastName":"Bush" },'
 6                     + '{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
 7             var obj = eval("(" + txt + ")");
 8             $("#fname").html(obj.employees[0].firstName);
 9             $("#lname").html(obj.employees[0].lastName);
10         });
11 </script>
12 </head>
13 <body>
14     <h2>在 JavaScript 中创建 JSON 对象</h2>
15 
16     <p>
17         First Name: <span id="fname"></span><br />
18          Last Name: <span id="lname"></span><br />
19     </p>
20 </body>

 

 

执行结果:

  

 

 说明:

由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。

eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:

            这个 eval() 中的俩()括号 非常重要!!!非常重要!!!非常重要!!!!

  虽然eval很强大,但是由于他能够处理所有的javascript代码。这么强大的功能就有了安全隐患,所有js有一个专门的方法来处理json,就是JSON.parse(json);

  我们把上面的eval()替换为JSON.parse(txt);执行后效果是一样的。而且避免了安全隐患。

  当然我们学习jquery的话就用jquery的方法来处理,jquery有一个方法是 $.parseJSON(json);用这个替换上面两个也是可以的。

--------------------------------

  当然我们还可以使用javascript 中的 JSON.stringify() 函数对js字符串,对象,数组,等进行json格式转化。便于向后台传输数据,此函数的具体解释看这里: http://www.runoob.com/js/javascript-json-stringify.html,

或者看这里:传送门:http://blog.csdn.net/qq_24122593/article/details/53046525

--------------------------------------------------------------

那了解到这里,我们下面开始用ajax对json串的发送与接收操作了。

案例1:ajax接收后台传来的json串;

  准备jsp代码:

    

 1 <script type="text/javascript">
 2         $().ready(function(){
 3             $("#button").click(function(){
 4                 $.ajax({
 5                     url:"${pageContext.request.contextPath}/ajaxtest",
 6                     type:"GET",
 7                     datatype:"json",
 8                     success:function(mapss){
 9                     var  jsonmap=$.parseJSON(mapss);
10                         $.each(jsonmap,function(is,vs){
11                             $("#"+is).html(vs);
12                         });
13                     }
14                 });
15             });
16         });
17     </script>
18   </head>
19   
20   <body>
21   <button id="button">点我</button>
22   <div id="div"><h2>json数据处理</h2></div>
23   用户名:<span id="username"></span><br/>
24   密码:<span id="password"></span>
25   </body>

 

  准备java代码:

  

1 HashMap<String, Object> map = new HashMap<String, Object>();
2             map.put("username", "pxf");
3             map.put("password", "mima");
4             JSONObject json = JSONObject.fromObject(map);
5             response.getWriter().print(json);

 

  执行结果:

    

其中这里最重要的就是  var jsonmap=$.parseJSON(mapss); 这一段,这一段是将后台callback回来的json格式转化为js对象,如果json格式不转成javascript对象的话,一切都白扯。

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-02-12 09:34  狂妄的老头  阅读(454)  评论(0编辑  收藏  举报