上面介绍了如何用 JSON表示数据,接下来,我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端,以及客户端如何使用 JavaScript 处理 JSON 格式的数据。
先来看看服务器如何输出JSON格式的数据吧。
以 Java 为例,我们将演示将一个Java 对象编码为 JSON 格式的文本。将 String 对象编码为 JSON格式时,只需处理好特殊字符即可。另外,必须用 (") 而非 (') 表示字符串:
<span style="font-family:SimHei;font-size:18px;">static Stringstring2Json(String s) {
StringBuilder sb = newStringBuilder(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();
}</span>
将 Number 表示为 JSON就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:
<span style="font-family:SimHei;font-size:18px;">static Stringnumber2Json(Number number) {
return number.toString();
}</span>
Boolean类型也可以直接通过 toString() 方法得到 JSON的表示:
<span style="font-family:SimHei;font-size:18px;"> static Stringboolean2Json(Boolean bool) {
return bool.toString();
}</span>
要将数组编码为 JSON格式,可以通过循环将每一个元素编码出来:
<span style="font-family:SimHei;font-size:18px;">static String array2Json(Object[] array) {
if (array.length==0)
return "[]";
StringBuilder sb = newStringBuilder(array.length << 4);
sb.append('[');
for (Object o : array) {
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}</span>
最后,我们需要将 Map<String, Object> 编码为 JSON格式,因为JavaScript 的 Object实际上对应的是 Java 的 Map<String, Object> 。该方法如下:
<span style="font-family:SimHei;font-size:18px;"> static Stringmap2Json(Map<String, Object> map) {
if (map.isEmpty())
return "{}";
StringBuilder sb = newStringBuilder(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();
}</span>
现在服务器端可以将各种数据类型的数据输出为JSON格式,那么客户端如何接受并显示这些数据呢?接下来我们就看看客户端如何使用JavaScript处理JSON格式的数据吧。假定服务器返回的 JSON 数据是上文的:
{"name":"Michael","address":
{"city":"Beijing","street":" ChaoyangRoad ","postcode":100025}
}
我们通过一个简单的 JavaScript方法就能看到客户端如何将 JSON 数据表示给用户:
<span style="font-family:SimHei;font-size:18px;">function handleJson() {
varj={"name":"Michael","address":
{"city":"Beijing","street":" ChaoyangRoad ","postcode":100025}
};
document.write(j.name);
document.write(j.address.city);
}</span>
只需将其赋值给一个JavaScript 变量,就可以立刻使用该变量并更新页面中的信息了,相比 XML 需要从 DOM 中读取各种节点而言,JSON的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求,然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理JSON 数据的能力,例如 Prototype(一个流行的 JavaScript 库:http://prototypejs.org)提供了 evalJSON() 方法,能直接将服务器返回的 JSON文本变成一个JavaScript 变量:
<span style="font-family:SimHei;font-size:18px;">new Ajax.Request("http://url", {
method: "get",
onSuccess: function(transport) {
var json = transport.responseText.evalJSON();
// TODO: document.write(json.xxx);
}
});</span>