一、知识点
分析XML与JSON的联系以及区别;
在java、Javascript之中进行JSON数据的操作。
2、具体内容
2.1 认识JSON
JSON是在XML之后产生的,XML产生的初期阶段实际上很多人并不清楚XML可以做什么,所以后来才有了一系列的问题:XML作为信息交互,XML可以配置CSS、XLS进行内容显示等。但是随着技术慢慢的发展,很多技术公司都将XML文件作为了配置文件的首选(因为其语法的严谨性问题)。
那么针对于XML文件的数据传输呢?在最早的AJAX产生的初期的时候,可以与XML一起进行异步数据的有效传输,但是也会存在问题:
- XML生成复杂,如果不适用专门的工具几乎是不可能完成的,那么工具很复杂;
-
传输的数据太庞大了,下面针对与数据的庞大与否做一个比较,那么现在希望进行数据的传输,传输如下内容:
公司名称=ynsf, 地址=昆明, 网址=www.ynsf.com, 学生=黄玉泽23、 huangyuaze 24、张三26 |
范例:观察内容格式
XML文档格式 | JSON文档格式 |
|
|
实际上在数据传输的时候最重要的两个内容:传输的名称,传输的内容。但是在使用XML格式作为传输格式的时候,发现需要传输的标记过多,标记一多一定会浪费网络资源,那么就必须采用一种更加轻量级的数据传输,所以JSON(Javacript ObjectNotation)格式进行传输就可以有效的进行代码的节约。
随着技术的发展,JSON格式使用越来越广泛,在数据传输上也已经完全取代了XML,而Javascript也支持JSON的数据解析。
2.2 操作JSON数据
如果要想操作JSON数据用户可以完全自己手工编写文本数据,或者也可以使用专门的JSON数据包进行开发,如果要想使用JSON数据包开发,就必须搞明白两个类:
-
单一的JSON对象:JSONObject;
- 一组JSON对象:JSONArray。
以上就是一个JSON保存了基本数据与数组的结构形式,通过代码可以发现,在JSON操作之中,根目录可以是一个JSON对象,也可以是一个数组。而后每一个JSON对象都按照“key:value”的形式保存,而且大部分情况下为了避免有可能出现的问题,key和value都使用双引号(“ ”)进行声明。如果是JSON数组,则会包含多个JSON对象。
如果想要操作JSON,则需要将JSON工具包导入项目之中,需要导入的jar如下:
commons-beanutils-1.7.0.jar
commons-collections-3.2.1.jar
commons-httpclient-3.1.jar
commons-lang-2.3.jar
commons-logging-1.1.1.jar
ezmorph-1.0.3.jar
json-lib-2.2.3-jdk15.jar
范例:生成一个简单的JSON数据
package com.ynsf.jsonproject.create;
import net.sf.json.JSONObject;
public class JSONCreate01 {
public static void main(String[] args) {
//总的信息保存
JSONObject allData = new JSONObject();
//保存title,address,url信息
allData.put("title", "云南师范大学");
allData.put("address", "昆明");
allData.put("url", "www.yunnan.edu");
System.out.println(allData);
}
}
通过此代码可以发现,整个JSON数据都使用了“{}”声明,里面的每一组内容都采用“,”进行分隔。
范例:生成JSON数据
package com.ynsf.jsonproject.create;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JSONCreate01 {
public static void main(String[] args) {
//定义数组
String[] names = new String[] {"黄玉泽", "张三", "李四"};
int[] ages = new int[] {23, 24, 25};
//总的信息保存
JSONObject allData = new JSONObject();
//保存title,address,url信息
allData.put("title", "云南师范大学");
allData.put("address", "昆明");
allData.put("url", "www.yunnan.edu");
JSONArray jsonArray = new JSONArray();
for(int i = 0; i < names.length; i ++) {
JSONObject object = new JSONObject();
object.put("name", names[i]);
object.put("age", ages[i]);
jsonArray.add(object);
}
allData.put("students", jsonArray);
System.out.println(allData);
}
}
result:
{"title":"云南师范大学","address":"昆明","url":"www.yunnan.edu","students":[{"name":"黄玉泽","age":23},{"name":"张三","age":24},{"name":"李四","age":25}]} |
此时可以发现,如果要数据JSON数据,直接输出JSONObject对象即可,非常省事。
那么以上演示而来JSON数据的生成过程,日后这个过程一定要交给Servlet完成,但是在JSON的开发包里面也支持了JSON数据的解析功能。有一点需要注意的是,待解析的JSON文本必须符合JSON格式,否则是无法解析的。
范例:解析JSON数据
package com.ynsf.jsonproject.parse;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
//JSON解析
public class JSONParse {
public static void main(String[] args) {
String jsonStr = "{\"title\":\"云南师范大学\"," +
"\"address\":\"昆明\"," +
"\"url\":\"www.yunnan.edu\"," +
"\"students\":[{\"name\":\"黄玉泽\",\"age\":23}," +
"{\"name\":\"张三\",\"age\":24}," +
"{\"name\":\"李四\",\"age\":25}]}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
System.out.println("标题:" + jsonObject.getString("title"));
System.out.println("地址:" + jsonObject.getString("address"));
System.out.println("url:" + jsonObject.getString("url"));
System.out.println("学生:");
JSONArray ja = jsonObject.getJSONArray("students");
for(int i = 0; i < ja.size(); i ++) {
JSONObject object = ja.getJSONObject(i);
System.out.println("\t | 姓名:" + object.getString("name") + ", 年龄:" + object.getInt("age"));
}
}
}
result:
标题:云南师范大学 地址:昆明 url:www.yunnan.edu 学生: | 姓名:黄玉泽, 年龄:23 | 姓名:张三, 年龄:24 | 姓名:李四, 年龄:25 |
2.3 使用Javascript操作JSON
通过上面的代码可以发现,使用json工具包可以方便的生成和解析JSON数据(生成JSON数据,在日后的开发中一定会用到,但是解析部分如果是企业级开发,基本上用不到,但是在移动端(android,ios,wp…)就需要JSON的解析了),但是日后使用了Ajax传输了JSON数据给客户端,那么客户端一定要使用JavaScript来处理JSON数据。
在javascript中操作JSON有两种定义方式:一种是直接定义JSON对象,另外一种是定义文本数据而后转换;
范例:演示JSON数据的处理操作
<script type="text/javascript">
//直接定义JSON对象
var obj = {
id : 1,
title : "云南师范大学",
add : function(a, b) {
return a + b;
}
};
alert("id = " + obj.id);
alert("title = " + obj.title);
alert("add : " + obj.add(5, 4));
</script>
但是以上只生成了基本的简单的数据,那么以下要生成数组数据。
范例:操作数组
<script type="text/javascript">
//直接定义JSON对象
var obj = {
id : 1,
title : "云南师范大学",
//函数
add : function(a, b) {
return a + b;
},
//数组
students : [{name : "黄玉泽", age : 23},{name : "张三", age : 24}]
};
alert("id = " + obj.id);
alert("title = " + obj.title);
alert("add : " + obj.add(5, 4));
for(var i = 0; i < obj.students.length; i ++) {
var temp = obj.students[i];
alert("姓名:" + temp.name + ", 年龄:" + temp.age);
}
</script>
以上的代码操作很容易,但是不要忘记了,以上代码是直接定义了JSON格式的对象,但是在开发之中,由服务器端利用AJAX传送的数据都是文本数据,所以在Javascript中专门提供了有可以将JSON文本变为JSON对象的函数: eval()函数。 但是如果想要使用此函数则JSON数据必须使用“()”声明。
范例:解析JSON文本数据
<pre name="code" class="javascript"><script type="text/javascript">
var jsonStr = "{\"title\":\"云南师范大学\"," +
"\"address\":\"昆明\"," +
"\"url\":\"www.yunnan.edu\"," +
"\"students\":[{\"name\":\"黄玉泽\",\"age\":23}," +
"{\"name\":\"张三\",\"age\":24}," +
"{\"name\":\"李四\",\"age\":25}]}";
<strong>var jsonObject = eval("(" + jsonStr + ")");</strong>
alert("标题:" + jsonObject.title);
alert("地址:" + jsonObject.address);
alert("url:" + jsonObject.url);
for(var i = 0; i < jsonObject.students.length; i ++) {
var temp = jsonObject.students[i];
alert("姓名:" + temp.name + ', 年龄:' + temp.age);
}
</script>
实际上eval()这个函数是有缺陷的,它里面的代码可以执行。
范例:观察eval()函数的问题
<script type="text/javascript">
var num = 10;
var jsonStr = "{\"num\": ++num}";
var jo = eval("(" + jsonStr + ")");
alert(jo.num);
</script>
如果直接使用eval()函数进行处理,会发现此时字符串里面包含代码,那么代码会继续执行,所以这种操作就会存在安全隐患。如果想要使用更安全的操作,则可以登陆www.json.org上下载JSON的Javascript的开发包 。
将下载下来的json.js拷贝到项目之中,直接使用此工具进行解析。范例:处理eval()函数的问题
<script type="text/javascript">
var num = 10;
var jsonStr = "{\"num\": ++num}";
var temp = <strong>JSON.parse(jsonStr)</strong>; //将字符串转换为JSON对象
alert(temp.num);
</script>
此时由于在代码之中存在非正常字符,所以json工具可以进行错误的检查(JSON.parse()与eval()比较就多了一些正则验证。)
范例:使用json工具解析之前用eval()解析的例子
<script type="text/javascript" src="js/json.js"></script>
<script type="text/javascript">
var jsonStr = "{\"title\":\"云南师范大学\"," +
"\"address\":\"昆明\"," +
"\"url\":\"www.yunnan.edu\"," +
"\"students\":[{\"name\":\"黄玉泽\",\"age\":23}," +
"{\"name\":\"张三\",\"age\":24}," +
"{\"name\":\"李四\",\"age\":25}]}";
var jsonObject = JSON.parse(jsonStr);
alert("标题:" + jsonObject.title);
alert("地址:" + jsonObject.address);
alert("url:" + jsonObject.url);
for(var i = 0; i < jsonObject.students.length; i ++) {
var temp = jsonObject.students[i];
alert("姓名:" + temp.name + ', 年龄:' + temp.age);
}
</script>
那么eval()与JSON.parse()有什么区别?
- eval()函数是由浏览器提供的,直接用于将文本转换为JSON对象;
- JSON.parse() 最终也是调用eval()函数,但是在JSON.parse()函数里面增加了字符串的正则验证,所以出现了一些非法的程序也可以进行异常的抛出,而eval()函数会将代码执行。
如果现在前台操作的JSON数据完全由用户自己生成,那么一定是合法的,只需要eval()函数直接处理即可。如果你的项目要接收第三方传递而来的JSON数据,那就需要考虑安全问题了(使用JSON.parse()函数)