一、什么是 JSON ?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言。JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言
  • JSON 具有自我描述性,更易理解

二、JSON - 转换为 JavaScript 对象

JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。

由于这种相似性,无需解析器,JavaScript 程序能够使用内建的eval( ) 函数,用 JSON 数据来生成原生的 JavaScript 对象。

转换的时候注意,eval 函数要以( 开头,)结尾。

三、为什么使用 JSON?

对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用:

使用 XML

  • 读取 XML 文档
  • 使用 XML DOM 来循环遍历文档
  • 读取值并存储在变量中

使用 JSON

  • 读取 JSON 字符串
  • 用 eval() 处理 JSON 字符串

四、JSON语法

JSON 语法是 JavaScript 对象表示法语法的子集。

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号{ } 保存对象
  • 方括号[ ] 保存数组

JSON 对象(名称/值对)

JSON 数据的书写格式是:名称/值对。

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。

JSON 对象在花括号中书写。

对象可以包含多个名称/值对。

JSON 对象创建:

var person = {"name": "yangTengYu", "age": 26, "sex" : "male"};

name = "yangtengyu" ...

JSON对象案例

json1.jsp :

<script type="text/javascript">
window.onload = function() {
	var person = {"name": "yangTengYu", "age": 26, "sex" : "male"};
	alert(person.name + "," + person.age + "," + person.sex);
	
}
</script>  
  </head>
  <body>
  
<h1>json的应用</h1>
  </body>
</html>

JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中 [ ] )
  • 对象(在花括号中 { } )
  • null

JSON 数组

JSON 数组在方括号中书写。

数组可包含多个对象:

JSON数组案例

json3.jsp :

<script type="text/javascript">
	var heros =
	 [
	 	{"name":"盖伦", "hp":616},
	 	{"name":"赵信", "hp":617},
	 	{"name":"劫", "hp":618},
	 	{"name":"鳄鱼", "hp":619}
	 ]
	 
	 document.write("JSON数组大小为" + heros.length + "<hr>");
 	 document.write("第3个英雄是:" + heros[2].name + "<br>");
 	 
</script>
  </head>

五、字符串与JSON的相互转换

字符串转为JSON对象

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

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

var obj = eval("(" + txt + ")");

字符串转为JSON对象案例

json4.jsp :

<script type="text/javascript">
	var s1 = "{\"name\":\"火女\"";
	var s2 = ",\"hp\":616}";
	var s3 = s1+s2;
	
	document.write("这是一个JSON格式的字符串:" + s3);
	document.write("<br>");
	var huonv = eval("(" + s3 + ")");
	document.write("这是一个JSON对象的值:" + huonv.hp);
	
</script>
  </head>

JSON 对象转换为字符串

json 对象因为是一个javascript对象,所以如果直接打印的话,看不到里面的内容。

有时候要看看这个对象是不是我们期望的,所以需要通过 JSON.stringify

json6.jsp :

<script type="text/javascript">
	var hero = {"name":"盖伦", "level":"16"};
	document.write("这是一个json对象的值:" + hero.level + "<hr>");
	var heroString = JSON.stringify(hero);
	document.write("这是一个JSON字符串:" + heroString);
</script>
  </head>

六、AJAX与JSON联合使用

AServlet.java :

package waf.yty.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
			// 向客户端发送json串
			String str = "{\"name\":\"Fingercroxx\", \"age\":18, \"sex\":\"nanren\"}";
			response.getWriter().print(str);
			System.out.println(str);


	}

}

json2.jsp :

<script type="text/javascript">
window.onload = function() {

	var btn = document.getElementById("btn");
	btn.onclick = function() {
	
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("GET", "${pageContext.request.contextPath}/AServlet", true);
	xmlhttp.send(null);
	xmlhttp.onreadystatechange = function() {
			if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				var text = xmlhttp.responseText; //返回一个JSON串
				var person = eval("(" + text + ")");
				document.getElementById("h2").innerHTML
				 = person.name + "," + person.age + "," + person.sex
			}
		}
	}
}
</script>
  </head>
  
  <body>
 <button id="btn">猛击这里</button> 
<h1>JSON之JSON2</h1>
<h2 id="h2"></h2>
  </body>
</html>