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文件
然后是jsonTest.jsp页面
接着是struts.xml文件
然后是POJO类
最后是核心的GetJsonAction类
除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; } }
相关文章推荐
- auto_ptr and its usage
- JSON Introduction and JSONObject usage
- Key usage extensions and extended key usage
- Python Web-第六周-JSON and the REST Architecture(Using Python to Access Web Data)
- There is no Action mapped for namespace / and action name getjson
- spring2.5.6的‘annotation-config’ and its parser class are only available on JDK 1.5 and higher错误解决
- Usage sample of unix mutex and conditional
- java.lang.IllegalStateException: Context namespace element 'component-scan' and its parser class [or
- Conversion between json and object
- EventBus报错:and its super classes have no public methods with the @Subscribe annotation
- 【Java】--@JsonIgnore and @JsonProperty
- What is JSON ?
- Swift -- Collecting usage statistics and detecting failed hard drives
- Demo XML 、 JSON 解析 AND 网络HTTP请求
- Its black outside and sleek body feature are manufactured in the modern
- ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
- What is “Begin Trans”, “Commit Tran”, “Rollback Tran” and "save tran"
- Convert object to json and json to object in C#
- MYSQL之union和order by分析([Err] 1221 - Incorrect usage of UNION and ORDER BY)
- Spring 3 MVC And JSON Example