charc=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('\"');
returnsb.toString();
}
将Number表示为JSON就容易得多,利用Java的多态,我们可以处理Integer,Long,Float等多种Number格式:
staticStringnumber2Json(Numbernumber){
returnnumber.toString();
}
Boolean类型也可以直接通过toString()方法得到JSON的表示:
staticStringboolean2Json(Booleanbool){
returnbool.toString();
}
要将数组编码为JSON格式,可以通过循环将每一个元素编码出来:
staticStringarray2Json(Object[]array){
if(array.length==0)
return"[]";
StringBuildersb=newStringBuilder(array.length<<4);
sb.append('[');
for(Objecto:
array){
sb.append(toJson(o));
sb.append(',');
}
//将最后添加的','变为']':
sb.setCharAt(sb.length()-1,']');
returnsb.toString();
}
最后,我们需要将Map编码为JSON格式,因为JavaScript的Object实际上对应的是Java的Map。
该方法如下:
staticStringmap2Json(Mapmap){
if(map.isEmpty())
return"{}";
StringBuildersb=newStringBuilder(map.size()<<4);
sb.append('{');
Setkeys=map.keySet();
for(Stringkey:
keys){
Objectvalue=map.get(key);
sb.append('\"');
sb.append(key);
sb.append('\"');
sb.append(':
');
sb.append(toJson(value));
sb.append(',');
}
//将最后的','变为'}':
sb.setCharAt(sb.length()-1,'}');
returnsb.toString();
}
为了统一处理任意的Java对象,我们编写一个入口方法toJson(Object),能够将任意的Java对象编码为JSON格式:
publicstaticStringtoJson(Objecto){
if(o==null)
return"null";
if(oinstanceofString)
returnstring2Json((String)o);
if(oinstanceofBoolean)
returnboolean2Json((Boolean)o);
if(oinstanceofNumber)
returnnumber2Json((Number)o);
if(oinstanceofMap)
returnmap2Json((Map)o);
if(oinstanceofObject[])
returnarray2Json((Object[])o);
thrownewRuntimeException("Unsupportedtype:
"+o.getClass().getName());
}
我们并未对Java对象作严格的检查。
不被支持的对象(例如List)将直接抛出RuntimeException。
此外,为了保证输出的JSON是有效的,Map对象的Key也不能包含特殊字符。
细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的Map,就可以检测到StackOverflowException:
@Test(expected=StackOverflowError.class)
publicvoidtestRecurrsiveMap2Json(){
Mapmap=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. "address":
8. [
9. {"city":
"beijing","postcode":
"222333"},
10. {"city":
"newyork","postcode":
"555666"}
11. ]
12. }
13. alert(user.username);
14. alert(user.age);
15. alert(user.info.cellphone);
16. alert(user.address[0].city);
17. alert(user.address[0].postcode);
18.}
这表示一个user对象,拥有username,age,info,address等属性。
同样也可以用JSON来简单的修改数据,修改上面的例子,js代码
1.function showJSON() {
2. var user =
3. {
4. "username":
"andy",
5. "age":
20,
6. "info":
{ "tel":
"123456", "cellphone":
"98765"},
7. "address":
8. [
9. {"city":
"beijing","postcode":
"222333"},
10. {"city":
"newyork","postcode":
"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.
20. user.username = "Tom";
21. alert(user.username);
22.}
JSON提供了json.js包,下载http:
//www.json.org/json.js后,将其引入然后就可以简单的使用object.toJSONString()转换成JSON数据。
js代码
1.function showCar() {
2. var carr = new Car("Dodge", "Coronet R/T", 1968, "yellow");
3. alert(carr.toJSONString());
4.}
5.function Car(make, model, year, color) {
6. this.make = make;
7. this.model = model;
8. this.year = year;
9. this.color = color;
10.}
可以使用eval来转换JSON字符到Object,js代码
1.function myEval() {
2. var str = '{ "name":
"Violet", "occupation":
"character" }';
3. var obj = eval('(' + str + ')');
4. alert(obj.toJSONString());
5.}
或者使用parseJSON()方法
js代码
1.function myEval() {
2. var str = '{ "name":
"Violet", "occupation":
"character" }';
3. var obj = str.parseJSON();
4. alert(obj.toJSONString());
5.}
下面使用prototype写一个JSON的ajax例子。
先写一个servlet(我的是servlet.ajax.JSONTest1.java)就写一句话
java代码
1.response.getWriter().print("{ \"name\":
\"Violet\", \"occupation\":
\"character\" }");
再在页面中写一个ajax的请求
js代码
1.function sendRequest() {
2. var url = "/MyWebApp/JSONTest1";
3. var mailAjax = new Ajax.Request(
4. url,
5. {
6. method:
'get',
7. onComplete:
jsonResponse
8. }
9. );
10.}
11.
12.function originalRequest) {
13. alert(originalRequest.responseText);
14. var myobj = originalRequest.responseText.parseJSON();
15. alert(myobj.name);
16.}
prototype-chsdatew:
st="on"isrocdate="False"islunardate="False"day="30"month="12"year="1899">1.5.1
chsdate>.js中提供了JSON的方法,String.evalJSON(),可以不使用json.js,修改上面的方法
js代码
1.function originalRequest) {
2. alert(originalRequest.responseText);
3. var myobj = originalRequest.responseText.evalJSON(true);
4. alert(myobj.name);
5.}
JSON还提供了java的jar包http:
//www.json.org/java/index.htmlAPI也很简单,下面举个例子
在javascript中填加请求参数
js代码
1.function sendR