格式定义非常简单,就是通过一组键值对来定义一个对象。
你可以直接将这种格式的数据赋值给一个变量,然后通过键名取值。相对于使用xml来作为数据交换格式,如果要在javascript里使用,首先需要创建 一个DOMParser,然后通过DOM接口访问节点对象,非常繁琐,更不用说不同浏览器的实现中DOMParser的实现和DOM接口都有诸多不同。为 什么大量的AJAX应用中宁可直接返回一个HTML片断而不是直接把 XML交给javascript处理,一个主要原因就是处理XML的过程比较复杂。JSON最重要的贡献就是简化了解析数据的过程。
del.icio.us提供的在网页上显示书签的javascript脚本就基于JSON, 看一下这个脚本 ,再设想一下通过AJAX读取del.icio.us提供的RSS接口来实现这个功能,就能体会JSON的巧妙了。
除此之外,更有人提出类似XSLT的 JSONT ,可以将JSON格式的内容转换成其他形式,虽然还暂时还没有XSLT灵活和强大,至少展示了一种可能性。(文章来源 www.iocblog.net)
JSON解决的另一个传统AJAX中xmlhttprequest不能解决的问题就是跨域链接的问题。基于安全考虑,各种浏览器缺省都不允许 xmlhttprequest跨域名链接,abc.com页面上的xmlhttprequest是无法连接def.com的内容的。在网页中,JSON可 以采用引入script元素的方式导入数据,html中的script可以指定非本地脚本,跨域链接的问题得以解决。但使用这样的方式导入JSON数据, 是一个同步的过程(是否可以用defer属性来实现异步?),这点上不如xmlhttpreqeust灵活。
JSON运行信赖包文件如下:
ezmorph-1.0.1.jar http://ezmorph.sourceforge.net/
http://jakarta.apache.org/commons/index.html
commons-beanutils.jar
commons-httpclient.jar
commons-lang.jar
commons-logging.jar
JSON定义
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。它基于ECMA262语言规范(1999-12第三版)中JavaScript 编程语言的一个子集。 JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的习惯,这些特性使JSON成为理想的数据交换格式。
[只是一种数据交换用的语言而已的哦!]
JSON的结构基于下面两点
其也是有自己的语言格式的哦!
JSON以一种特定的字符串形式来表示 JavaScript 对象。如果将具有这样一种形式的字符串赋给任意一个 JavaScript 变量,那么该变量会变成一个对象引用,而这个对象就是字符串所构建出来的,好像有点拗口,我们还是用实例来说明。
这里假设我们需要创建一个User对象,并具有以下属性
您可以使用以下JSON形式来表示User对象:
{"UserID":11, "Name":"Truly", "Email":"zhuleipro◎hotmail.com"};
然后如果把这一字符串赋予一个JavaScript变量,那么就可以直接使用对象的任一属性了。(文章来源 www.iocblog.net)
完整代码:
实际使用时可能更复杂一点,比如我们为Name定义更详细的结构,使它具有FirstName和LastName:
{"UserID":11, "Name":{"FirstName":"Truly","LastName":"Zhu"}, "Email":"zhuleipro◎hotmail.com"}
完整代码:
现在我们增加一个新的需求,我们某个页面需要一个用户列表,而不仅仅是一个单一的用户信息,那么这里就需要创建一个用户列表数组。
下面代码演示了使用JSON形式定义这个用户列表:
[
{"UserID":11, "Name":{"FirstName":"Truly","LastName":"Zhu"}, "Email":"zhuleipro◎hotmail.com"},
{"UserID":12, "Name":{"FirstName":"Jeffrey","LastName":"Richter"}, "Email":"xxx◎xxx.com"},
{"UserID":13, "Name":{"FirstName":"Scott","LastName":"Gu"}, "Email":"xxx2◎xxx2.com"}
]
完整代码:
事实上除了使用"."引用属性外,我们还可以使用下面语句:
alert(UserList[0]["Name"]["FirstName"]); 或者 alert(UserList[0].Name["FirstName"]);
现在读者应该对JSON的使用有点认识了,归纳为以下几点:
小节 :
本文通过一个实例演示,初步了解了JSON 的强大用途。可以归结如下:
参考资料:
http://www.json.org/
对象及数组分开是这样来定义的哦!
通过{}及[]来分别定义
属性名与值之间是用:提示,属性之间用,分隔的哦!
Ajax对象来传递信息,可以读作“Jason”
AJAX中可以不用XML了哈哈,直接用JS中自身的对象来处理的哦!
JSON概念很简单,就是服务器直接生成 JavaScript语句,客户端获取后直接用eval方法来获得这个对象,
[可以说是在服务器直接生成了JS语句然后客户端通过eval命令得到这个对象之后就可以利用这个对象了!]
这样就可以省去解析XML的性能损失。比如传递Blog评论的示例:
使用XML表示:
使用JSON:
分析一下这个对象:{}
{comments:[{},{},{}]};对象之间是通过,进行分隔开的哦!
很容易发现,使用JSON不仅减少了解析XML解析带来的性能问题和兼容性问题,而且对于JavaScript来说非常容易使用,可以方便的通过遍历数组 以及访问对象属性来获取数据,其可读性也不错,基本具备了结构化数据的性质。不得不说是一个很好的办法,
而且事实上google maps就没有采用XML传递数据,而是采用了JSON方案。
JSON的另外一个优势是跨域可行性,例如你在www.xxx.com的网页里使用是完全可行的,这就意味着你可以跨域传递信 息。而使用XMLHttpRequest却获取不了跨域的信息,这是JavaScript内部的安全性质所限制的。
JSON看上去很美,是不是就能完全取代XML呢?事实并非如此,而原因就在于XML的优势:通用性。要使服务器端产生语法合格的JavaScript代 码并不是很容易做到的,这主要发生在比较庞大的系统,服务器端和客户端有不同的开发人员。它们必须协商对象的格式,这很容易造成错误。
无论如何,JSON是一个诱人的技术,准备在X2Blog做一个大量的试用。希望届时可以获取大的性能提高。
[可以尝试玩一下用JSON+JS实现新的AJAX技术吧!]
很多资料上都说JSON在更多的场合都比XML更适合Ajax的数据传送,但google很久没有找到JSON的如何像XML那样的遍历,其实JSON是一种JS定义对象的一种特殊的形势,所以可以按照对象的方法来访问,但又有一些不同.JSON太神奇了,呵呵,做了个小例子,不知道如何读取JSON中的值的朋友看一下吧!
[来源www.iocblog.net]
此外,如果服务器返回得responseText内容是{"msg":[{"user":"llinzzi","msg":"你好"},{"user": "Huanhuan","msg":"嘿嘿"}],"type":"test"}格式的,在ajax要进行赋值的时候必须是
var msg=eval('(' + req.responseText + ')');
[来源www.iocblog.net]
?现在要想一个问题就是服务器端如何生成JSON呢?
和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象。
String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为:
abc"
|
"
,/
,/
和一些控制符(/b
,/f
,/n
,/r
,/t
)需要编码外,其他 Unicode 字符可以直接输出。下图是一个 String 的完整表示结构true
或 false
。此外,JavaScript 中的 null 被表示为 null
,注意,true
、false
和 null
都没有双引号,否则将被视为一个 String 。[]
包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null:
["abc",12345,false,null]
它的数据类型其实与其他语言的很相似的哦!包含了基本数据类型及对象类型!
Object 对象在 JSON 中是用 {}
包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>
,而不是 Java 的 Class 。注意 Key 只能用 String 表示。对象是用{}表示的哦!相当于Map正是所谓的名值对应关系啊!
例如,一个 Address 对象包含如下 Key-Value:
city:Beijing street:Chaoyang Road postcode:100025(整数)
用 JSON 表示如下:
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
|
其中 Value 也可以是另一个 Object 或者数组,因此,复杂的 Object 可以嵌套表示,例如,一个 Person 对象包含 name 和 address 对象,可以表示如下:
{"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
}
其实一个名所对应的值也可以是一个对象的哦!
{"name":"Michael","address":{"city":"beijing","street":"chong road"}}这里面的一个值就是一个对象了!
1.如何用JS来处理JSON呢?
function handleJson() {
var j={"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
};
document.write(j.name);
document.write(j.address.city);
}
可以变量J就是一个JSON对象了。包括了值又是一个对象
假定服务器返回的 JSON 数据是上文的:
{"name":"Michael","address": |
只需将其赋值给一个 JavaScript 变量,就可以立刻使用该变量并更新页面中的信息了,相比 XML 需要从 DOM 中读取各种节点而言,JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求,然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力,例如 Prototype(一个流行的 JavaScript 库:http://prototypejs.org)提供了 evalJSON()
方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量:
new Ajax.Request("http://url", { method: "get", onSuccess: function(transport) { var json = transport.responseText.evalJSON(); // TODO: document.write(json.xxx); } });
客户端要如何来得到这个JSON对象呢?通过内库来用方法哦!
看看在服务器生成JSON呢?
将 String 对象编码为 JSON 格式时,只需处理好特殊字符即可。另外,必须用 ("
) 而非 ('
) 表示字符串:String 中的话要特别注意好特殊字符的处理了!
为了能够控制得好字符串的输出看看如何处理的?
static String string2Json(String s) {
StringBuilder sb = new StringBuilder(s.length()+20);
sb.append('/"');
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '/"': //处理这种特殊字符串哦!
sb.append("///"");
break;
case '//':
sb.append("////");
break;
case '/':
sb.append("///");
break;
case '/b':
sb.append("//b");
break;
case '/f':
sb.append("//f");
break;
case '/n':
sb.append("//n");
break;
case '/r':
sb.append("//r");
break;
case '/t':
sb.append("//t");
break;
default:
sb.append(c);
}
}
sb.append('/"');
return sb.toString();
}
将 Number 表示为 JSON 就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:
static String number2Json(Number number) { return number.toString(); }
Boolean 类型也可以直接通过 toString()
方法得到 JSON 的表示:
static String boolean2Json(Boolean bool) { return bool.toString(); }
要将数组编码为 JSON 格式,可以通过循环将每一个元素编码出来:
static String array2Json(Object[] array) {
if (array.length==0)
return "[]";
StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (Object o : array) {
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
最后,我们需要将 Map<String, Object>
编码为 JSON 格式,因为 JavaScript 的 Object 实际上对应的是 Java 的 Map<String, Object>
。该方法如下:
static String map2Json(Map<String, Object> map) { if (map.isEmpty()) return "{}"; StringBuilder sb = new StringBuilder(map.size() << 4); sb.append('{'); Set<String> keys = map.keySet(); for (String key : keys) { Object value = map.get(key); sb.append('/"'); sb.append(key); sb.append('/"'); sb.append(':'); sb.append(toJson(value)); sb.append(','); } // 将最后的 ',' 变为 '}': sb.setCharAt(sb.length()-1, '}'); return sb.toString(); }
告诉了我们如何生成的每一种数据类型,包括字符串数字布尔类型及数组仍至于Map类型。
为了统一处理任意的 Java 对象,我们编写一个入口方法 toJson(Object)
,能够将任意的 Java 对象编码为 JSON 格式:
public static String toJson(Object o) { //可以将对象编码成JSON格式哦!
if (o==null)
return "null";
if (o instanceof String)
return string2Json((String)o);
if (o instanceof Boolean)
return boolean2Json((Boolean)o);
if (o instanceof Number)
return number2Json((Number)o);
if (o instanceof Map)
return map2Json((Map<String, Object>)o);
if (o instanceof Object[])
return array2Json((Object[])o);
throw new RuntimeException("Unsupported type: " + o.getClass().getName());
}
已经成功编码成功了JSON了,现在就可以考虑如何从服务器端往客户端输出了哦!
response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(JsonUtil.toJson(obj));
pw.flush();
JSON 已经是 JavaScript 标准的一部分。目前,主流的浏览器对 JSON 支持都非常完善。
应用 JSON,我们可以从 XML 的解析中摆脱出来,
对那些应用 Ajax 的 Web 2.0 网站来说,JSON 确实是目前最灵活的轻量级方案。
(二)
JSON ( JavaScript Object Notation) 允许轻松地将 JavaScript 对象转换成可以随请求发送的数据(同步或异步都 可以)。本文首先介绍 JSON 的数据格式,接着介绍如何在 JavaScript 中使用 JSON ,重点介绍一下如何使用 JSON 完成数据的异步传输。
1. JSON 的数据格式
a) 按照最简单的形式,可以用下面这样的 JSON 表示 名称 / 值对:
{ "firstName": "Brett" } |
b) 可以创建包含多个名称 / 值对的记录 ,比如:
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "[email protected]" } |
c) 可以创建值的数组
{ "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "[email protected]" }, { "firstName": "Jason", "lastName":"Hunter", "email": "[email protected]" } ]} |
d) 当然,可以使用相同的语法表示多个值(每个值包含多个 记录) :
{ "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", " email ": "[email protected]" }, { "firstName": "Jason", "lastName":"Hunter", "email": "[email protected]" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", " genre ": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", " instrument ": "guitar" } ] } |
注意 ,在不同的主条目( programmers 、 authors 和 musicians )之间,记录中实际的名称 / 值对可以不一样。 JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。
2. 在 JavaScript 中使用 JSON
JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。
2.1 将 JSON 数据赋值给变量
例如,可以创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:
var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "[email protected]" }, { "firstName": "Jason", "lastName":"Hunter", "email": "[email protected]" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" } ] } |
2.2 访问数据
将这个数组放进 JavaScript 变量之后,就可以很轻松地访问它。实际上,只需用点号 表示法来表 示数组元素。所以,要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:
people . programmers [0]. lastName; |
注意 ,数组索引是从零开始的 。
2.3 修改 JSON 数据
正如访问数据,可以按照 同样的方式修改数据:
people . musicians [1]. lastName = "Rachmaninov"; |
2.4 转换回字符串
a) 在 JavaScript 中这种转换也很简单:
String newJSONtext = people. toJSONString( ); |
b) 可以将任何 JavaScript 对象转换为 JSON 文本。并非只能处理原来用 JSON 字符串赋值的变量。为了对名为 myObject 的对象进行转换,只需执行相同形式的命令:
String myObjectInJSON = myObject.toJSONString(); |
说明:将转换回的字符串 作为 Ajax调 用的字符串,完成异步传输。
小结: 如果要处理大量 JavaScript 对象,那么 JSON 几乎肯定是一个好选择,这样就可以轻松地将数据转换为可以在请求中发 送给服务器端程序的格式。
3. 服务器端的 JSON
3.1 将 JSON 发给服务器
a) 通过 GET 以名 称 /值对发送 JSON
在 JSON 数据中会有空格和各种字符, Web 浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上(或者在将数据发送给服务器的过程中) 引起混乱,需要在 JavaScript 的 escape()函数中做如下添加:
var url = "organizePeople.php?people=" + escape (people.toJSONString()); request.open(" GET ", url, true); request.onreadystatechange = updatePage; request.send(null); |
b) 利用 POST 请求发送 JSON 数据
当决定使用 POST 请求将 JSON 数据发送给服务器时,并不需要对代码进行大量更改,如下所示:
var url = "organizePeople.php?timeStamp=" + new Date().getTime(); request.open(" POST ", url, true); request.onreadystatechange = updatePage; request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.send( people.toJSONString() ); |
注意:赋值时格式必须是 var msg=eval('(' + req.responseText + ')');
3.2 在服务器上解释 JSON
a) 处理 JSON 的两步骤 。
针对编 写服务器端程序所用的语 言,找到相应的 JSON 解析器 /工具 箱 /帮助 器 API。
使用 JSON 解析器 /工具 箱 /帮助 器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西。
b) 寻找 JSON 解析器
寻找 JSON 解析器或工具箱最好的资源是 JSON 站点。如果使用的是 Java servlet , json.org 上的 org.json 包就是个不错的选择。在这种情况下,可以从 JSON Web 站点下载 json.zip 并将其中包含的源文件添加到项目构建目录。编译完这些文件后,一切就就 绪了。对于所支持的其他语言,同样可以使用相同的步骤;使用何种语言取决于您对该语言的精通程度,最好使用您所熟悉的语言。
c) 使用 JSON 解析器
一旦获得了程序可用的资源,剩下的事就是找到合适的方法进行调用。如果在 servlet 中使用的是 org.json 包,则会使用如下代码:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StringBuffer jb = new StringBuffer(); String line = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) jb.append(line); } catch (Exception e) { //report an error } try { JSONObject jsonObject = new JSONObject(jb.toString()); } catch (ParseException e) { // crash and burn throw new IOException("Error parsing JSON request string"); } // Work with the data using methods like... // int someInt = jsonObject.getInt("intParamName"); // String someString = jsonObject.getString("stringParamName"); // JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName"); // JSONArray arr = jsonObject.getJSONArray("arrayParamName"); // etc... } |
4. 总结
通过对 JSON 数据格式和使用方法的了解,完成在服务器端的 JSON 格式的数据的传输和解析,即完成了数据的异步传输。