JSON知识复习

一、知识点

        分析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 version="1.0" encoding="UTF-8"?>
<company>
	<title>ynsf</title>
	<address>昆明</address>
	<url>www.ynsf.com</url>
	<students>
		<student>
			<name>黄玉泽</name>
			<age>23</age>
		</student>
		<student>
			<name>huangyuze</name>
			<age>24</age>
		</student>
		<student>
			<name>张三</name>
			<age>26</age>
		</student>
	</students>
</company>

{{"title":"ynsf"}, 
 {"address":"昆明"},
 {"url":"www.ynsf.com"},
 {"students":[
  {"name":"黄玉泽", "age":23}, {"name":"huangyuze", "age":24},
 {"name":"张三", "age":26}]}}

        实际上在数据传输的时候最重要的两个内容:传输的名称传输的内容。但是在使用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
     通过此代码可以发现与XML解析相比体现而来其简单性。

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()函数)








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值