您的位置:首页 > Web前端 > JavaScript

What is JSON and Its usage

2010-12-10 18:57 405 查看
JSON的起源
XML数据传输格式外,还有一种相对来说使用很多的数据传输格式
甚至某些场合使用的比XML还要多,这种数据传输格式就是所谓的JSON
JSON(JavaScript Object Notation)的官网是http://www.json.org
他的创建者是雅虎的主架构师,也是YUI(Yahoo User Interface)框架的架构师
他就是道格拉斯(Douglas Crockford),他是在雅虎工作期间发明的JSON数据传输格式



JSON的好处
JSON相对于XML来说,它读起来更加简单方便
JSON更加简洁,传输量更加少。因为它使用的字符明显少很多
对于大量数据的情况来说,使用XML显然比JSON要传输更多的数据
所以使用JSON可以在一定程度上降低网络负载
若使用JSON仅表示一个对象的话,直接{id: 1, name: zhangsan}即可
JSON的本质非常简单,它的基本想法就是通过name-value的形式描述信息
类似于Java集合的Map,下面分别举例通过XML和JSON描述2个用户的信息
[{id: 1, name: zhangsan}, {id: 2, name: lisi}]
<users>
<user>
<id>1</id>
<name>zhangsan</name>
</user>
<user>
<id>2</id>
<name>lisi</name>
</user>
</users>




下面是JSON与Struts2集成的演示其中前台页面使用了JQuery实现异步请求



首先是web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 	
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>
	
	<welcome-file-list>
		<welcome-file>jsonTest.jsp</welcome-file>
	</welcome-file-list>
</web-app>


然后是jsonTest.jsp页面

<%@ page pageEncoding="UTF-8"%>

<script type="text/javascript" src="JQuery/jquery-1.4.2.js"></script>

<script type="text/javascript">
    function getInfo(){
		$.post("getJson.action",
				{name: $("#name").val()},
				function(returnedData, status){
					if("success" == status){
						alert("请使用Firefox浏览器的FireBug插件来查看Action所返回的JSON信息");
					}
				}
			);
    }
</script>

<body id="theBody">
	<select id="name">
		<option value="zhangsan" selected="selected">zhangsan</option>
		<option value="lisi">lisi</option>
	</select>
	<input type="button" value="GetInfo" onclick="getInfo();">
</body>


接着是struts.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
	<package name="struts2.1" extends="json-default">
		<action name="getJson" class="com.langsin.action.GetJsonAction">
			<!-- 【不要忘记将struts2-json-plugin-2.1.8.1.jar导入项目中】 -->
			<!-- 由于这里JSON返回的是一个异步的调用所以并不需要显式指定具体页面 -->
			<!-- 在这里只需指定好result是json即可,它就会自动将数据返回给客户端 -->
			<result name="success" type="json">
				<!-- 通过excludeProperties参数标签可以指定某个属性不显示在客户端中 -->
				<!-- 并且excludeProperties参数标签中还可以使用正则表达式指定属性名 -->
				<!-- 使用JSON注解定制了属性所显示的名字后,这里就应指定所定制后的名字 -->
				<!-- 而includeProperties参数的作用则与excludeProperties完全相反 -->
				<!-- 但如果既使用includeProperties也使用了excludeProperties的话 -->
				<!-- 此时excludeProperties的优先级要高于includeProperties优先级 -->
				<param name="excludeProperties">name,myAge</param>
				<param name="includeProperties">name,myDate,id</param>
				
				<!-- 如果将ignoreHierarchy参数设定为false,即不忽略父类 -->
				<!-- 那么序列化时会将Action的父类ActionSupport类也序列化 -->
				<param name="ignoreHierarchy">false</param>
				
				<!-- 默认会序列化所有属性,但可以设定excludeNullProperties参数为true -->
				<!-- 那么序列化时将会排除值为null的属性,也就是说不会序列化值为null的属性 -->
				<param name="excludeNullProperties">true</param>
				
				<!-- 使用root参数可以指定序列化的起始点,默认的序列化起始点是Action -->
				<!-- <param name="root">person</param> -->
			</result>
		</action>
	</package>
</struts>


然后是POJO类

package com.langsin.bean;

import java.util.Date;

public class Person{
	private int id;
	private String name;
	private int age;
	private String address;
	private Date date;
	/*--这里五个变量相应的getter和setter略--*/
}


最后是核心的GetJsonAction类

package com.langsin.action;

import java.util.Date;

import org.apache.struts2.json.annotations.JSON;

import com.langsin.bean.Person;
import com.opensymphony.xwork2.ActionSupport;

public class GetJsonAction extends ActionSupport {
	private static final long serialVersionUID = -3256521184915884281L;
	
	//JSON插件能够将Action序列化为JSON对象,这只是一个笼统的说法
	//实际上是将Action的属性序列化成JSON对象,并且默认会将所有的属性都序列化成JSON对象
	//由于我们这里需要向客户端返回这四个属性信息,所以就将它们作为成员变量定义在Action里面
	//因为这几个属性是准备返回给客户端的,所以根据JSON的要求,必须提供setter和getter方法
	private int id;
	private int age;
	private String name;
	private String address;
	private Date date;
	private Person person = new Person();
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	//默认传送到客户端的age属性的名字就是age,但我们也可以使用JSON注解定制它所显示的名字
	//从Action到JSON是一个序列化的过程,需要获取Action中的属性组装成JSON对象,传给客户端
	//既然是获取Action属性,则显然调用的是getter方法,所以我们把JSON注解定义在getter方法上
	@JSON(name = "myAge")
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	//设定属性不可被序列化。即不会出现在最后结果的JSON中,即该属性不会被传递到客户端
	@JSON(serialize = false)
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	//而JSON默认Date类型的格式为"yyyy-MM-dd'T'HH:mm:ss",同样可以使用JSON注解定制显示格式
	@JSON(name = "myDate", format = "yyyy-MM-dd")
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}

	@Override
	public String execute() throws Exception {
		// zhangsan
		Person person1 = new Person();
		person1.setId(1);
		person1.setName("zhangsan");
		person1.setAge(20);
		person1.setAddress("shanghai");
		person1.setDate(new Date());

		// lisi
		Person person2 = new Person();
		person2.setId(2);
		person2.setName("lisi");
		person2.setAge(30);
		person2.setAddress("tianjin");
		person2.setDate(new Date());

		if ("zhangsan".equals(this.name)) {
			this.id = person1.getId();
			this.age = person1.getAge();
			this.address = person1.getAddress();
			this.date = person1.getDate();
		} else if("lisi".equals(this.name)) {
			this.id = person2.getId();
			this.age = person2.getAge();
			this.address = person2.getAddress();
			this.date = person2.getDate();
		}

		return SUCCESS;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: