JSON入门教程Word文档下载推荐.docx
《JSON入门教程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JSON入门教程Word文档下载推荐.docx(45页珍藏版)》请在冰豆网上搜索。
ChaoyangRoad"
postcode"
100025}
其中Value也可以是另一个Object或者数组,因此,复杂的Object可以嵌套表示,例如,一个Person对象包含name和address对象,可以表示如下:
name"
Michael"
address"
{"
}
JavaScript处理JSON数据
上面介绍了如何用JSON表示数据,接下来,我们还要解决如何在服务器端生成JSON格式的数据以便发送到客户端,以及客户端如何使用JavaScript处理JSON格式的数据。
我们先讨论如何在Web页面中用JavaScript处理JSON数据。
我们通过一个简单的JavaScript方法就能看到客户端如何将JSON数据表示给用户:
functionhandleJson(){
varj={"
{"
};
document.write(j.name);
document.write(j.address.city);
假定服务器返回的JSON数据是上文的:
只需将其赋值给一个JavaScript变量,就可以立刻使用该变量并更新页面中的信息了,相比XML需要从DOM中读取各种节点而言,JSON的使用非常容易。
我们需要做的仅仅是发送一个Ajax请求,然后将服务器返回的JSON数据赋值给一个变量即可。
有许多Ajax框架早已包含了处理JSON数据的能力,例如Prototype(一个流行的JavaScript库:
http:
//prototypejs.org)提供了evalJSON()方法,能直接将服务器返回的JSON文本变成一个JavaScript变量:
newAjax.Request("
//url"
{
method:
"
get"
onSuccess:
function(transport){
varjson=transport.responseText.evalJSON();
//TODO:
document.write(json.xxx);
}
});
服务器端输出JSON格式数据
下面我们讨论如何在服务器端输出JSON格式的数据。
以Java为例,我们将演示将一个Java对象编码为JSON格式的文本。
将String对象编码为JSON格式时,只需处理好特殊字符即可。
另外,必须用("
)而非('
)表示字符串:
viewplaincopytoclipboardprint?
1.static
String
string2Json(String
s)
{
2. StringBuilder
sb
=
new
StringBuilder(s.length()+20);
3. sb.append('
'
);
4. for
(int
i=0;
i<
s.length();
i++)
5. char
c
s.charAt(i);
6. switch
(c)
7. case
8. sb.append("
9. break;
10. case
11. sb.append("
12. break;
13. case
/'
14. sb.append("
/"
15. break;
16. case
b'
17. sb.append("
_"
18. break;
19. case
f'
20. sb.append("
f"
21. break;
22. case
n'
23. sb.append("
24."
25. break;
26. case
r'
27. sb.append("
28."
29. break;
30. case
t'
31. sb.append("
"
32. break;
33. default:
34. sb.append(c);
35. }
36. }
37. sb.append('
38. return
sb.toString();
39.}
将Number表示为JSON就容易得多,利用Java的多态,我们可以处理Integer,Long,Float等多种Number格式:
staticStringnumber2Json(Numbernumber){
returnnumber.toString();
Boolean类型也可以直接通过toString()方法得到JSON的表示:
staticStringboolean2Json(Booleanbool){
returnbool.toString();
要将数组编码为JSON格式,可以通过循环将每一个元素编码出来:
array2Json(Object[]
array)
2. if
(array.length==0)
3. return
[]"
;
4. StringBuilder
StringBuilder(array.length
<
4);
5. sb.append('
['
6. for
(Object
o
7. sb.append(toJson(o));
8. sb.append('
'
9. }
10. //
将最后添加的
变为
]'
11. sb.setCharAt(sb.length()-1,
12. return
13.}
最后,我们需要将Map<
编码为JSON格式,因为JavaScript的Object实际上对应的是Java的Map<
。
该方法如下:
map2Json(Map<
String,
Object>
map)
(map.isEmpty())
{}"
StringBuilder(map.size()
{'
6. Set<
String>
keys
map.keySet();
7. for
(String
key
keys)
8. Object
value
map.get(key);
9. sb.append('
10. sb.append(key);
11. sb.append('
12. sb.append('
13. sb.append(toJson(value));
14. sb.append('
15. }
16. //
将最后的
}'
17. sb.setCharAt(sb.length()-1,
18. return
19.}
为了统一处理任意的Java对象,我们编写一个入口方法toJson(Object),能够将任意的Java对象编码为JSON格式:
1.public
static
toJson(Object
o)
(o==null)
null"
4. if
(o
instanceof
String)
5. return
string2Json((String)o);
6. if
Boolean)
7. return
boolean2Json((Boolean)o);
8. if
Number)
9. return
number2Json((Number)o);
10. if
Map)
11. return
map2Json((Map<
)o);
12. if
Object[])
13. return
array2Json((Object[])o);
14. throw
RuntimeException("
Unsupported
type:
+
o.getClass().getName());
15.}
我们并未对Java对象作严格的检查。
不被支持的对象(例如List)将直接抛出RuntimeException。
此外,为了保证输出的JSON是有效的,Map<
对象的Key也不能包含特殊字符。
细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的Map,就可以检测到StackOverflowException:
@Test(expected=StackOverflowError.class)
publicvoidtestRecurrsiveMap2Json(){
Map<
map=newHashMap<
();
map.put("
key"
map);
JsonUtil.map2Json(map);
好在服务器处理的JSON数据最终都应该转化为简单的JavaScript对象,因此,递归引用的可能性很小。
最后,通过Servlet或MVC框架输出JSON时,需要设置正确的MIME类型(application/json)和字符编码。
假定服务器使用UTF-8编码,则可以使用以下代码输出编码后的JSON文本:
response.setContentType("
application/json;
charset=UTF-8"
response.setCharacterEncoding("
UTF-8"
PrintWriterpw=response.getWriter();
pw.write(JsonUtil.toJson(obj));
pw.flush();
小结
JSON已经是JavaScript标准的一部分。
目前,主流的浏览器对JSON支持都非常完善。
应用JSON,我们可以从XML的解析中摆脱出来,对那些应用Ajax的Web2.0网站来说,JSON确实是目前最灵活的轻量级方案。
JSON学习
JSON(JavaScriptObjectNotation)一种简单的数据格式,比xml更轻巧。
JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。
JSON的规则很简单:
对象是一个无序的“‘名称/值’对”集合。
一个对象以“{”(左括号)开始,“}”(右括号)结束。
每个“名称”后跟一个“:
”(冒号);
“‘名称/值’对”之间使用“,”(逗号)分隔。
具体细节参考http:
//www.json.org/json-zh.html
举个简单的例子:
js代码
1.function
showJSON()
{
2.
var
user
3.
4.
username"
andy"
5.
age"
20,
6.
info"
tel"
123456"
cellphone"
98765"
},
7.
8.
[
9.
beijing"
222333"
10.
newyork"
555666"
}
11.
]
12.
13.
14.
alert(user.username);
15.
alert(user.age);
16.
alert(user.info.cellphone);
17.
alert(user.address[0].city);
18.
alert(user.address[0].postcode);
19.}
这表示一个user对象,拥有username,age,info,address等属性。
同样也可以用JSON来简单的修改数据,修改上面的例子
19.
20.
user.username
Tom"
21.
22.}
JSON提供了json.js包,下载http:
//www.json.org/json.js后,将其引入然后就可以简单的使用object.toJSONString()转换成JSON数据。
showCar()
carr
Car("
Dodge"
Coronet
R/T"
1968,
yellow"
alert(carr.toJSONString());
4.}
6.function
Car(make,
model,
year,
color)
this.make
make;
this.model
model;
this.year
year;
this.color
color;
11.}
可以使用eval来转换JSON字符到Object
myEval()
str
Violet"
occupation"
character"
obj
eval('
('
)'
alert(obj.toJSONString());
5.}
或者使用parseJSON()方法
str.parseJSON();
下面使用prototype写一个JSON的ajax例子。
先写一个servlet(我的是servlet.ajax.JSONTest1.java)就写一句话
java代码
1.response.getWriter().print("
\"
name\"
Violet\"
occupation\"
character\"
}"
再在页面中写一个ajax的请求
sendRequest()
url
/MyWebApp/JSONTest1"
mailAjax
Ajax.Request(
url,
method:
get'
onComplete:
jsonResponse
10.}
12.function
originalRequest)
alert(originalRequest.responseText);
myobj
originalRequest.responseText.parseJSON();
alert(myobj.name);
16.}
prototype-<
st1:
chsdat