13.5 处理JSON响应
你已经收到服务器返回的包含格式化JSON字符串的响应。回到代码清单13-2,现在你可以编写必要的代码来处理和对这段JSON代码求值了。JSON的长处在于求值和导航的简洁性。你所需要的不是一个繁冗的解析器(相对于XML),而是一个eval()函数(它会执行JavaScript代码,而JSON字符串正是JavaScript代码)。使用jQuery库的话,它会得到细致的处理,如代码清单13-7所示。而你所需要做的只是指定数据类型(称为dataType)为“json”,即可从服务器接收到JSON数据。
代码清单13-7 从服务器获取结果并发送JavaScript数据结构到回调函数中
// 向服务器提交查询
$.ajax({
// 发送到API的URL
type: "POST",
url: apiURL,
// 串行化数据数组
data: $.param(p),
// 我们希望返回的是JSON数据
dataType: "json",
// 等待请求的成功完成
// 如果回调由用户指定,把数据送到回调中
success: callback
});
如果你稍加留意,会发现最后执行的动作是运行名为callback的函数,它指向由sqlExec函数提供的回调函数。传入这个函数的单一参数是在服务器端细心构造并显示给客户端的完整数据结构。要了解这个sqlExec-Ajax响应的流程是如何运作的,看看wiki实际运行的一个简化版本,如代码清单13-8所示。它的规定是,如果页面有过修订,就必须显示最近的一次修订。否则,应该显示一个表单以便用户能够创建新的修订。
代码清单13-8 用在客户端的代码的简化版本,从服务器获取修订并在页面上显示
// 请求当前wiki页面的所有修订
// 一旦载入,由 'loaded' 函数去调用返回的数据
sqlExec("select", [$s], loaded);
// 处理服务器返回的SQL结果
function loaded(sql) {
// 如果这条wiki存在修订
if ( sql.length > 0 ) {
// 显示wiki页面
showContent();
// 重新生成修订,使用textile格式化
$("#content").html(textile(sql[0].content));
// 让修订内容可编辑
$("textarea").val( sql[0].content );
// 否则,不存在修订的话,显示“创建”的表单
} else {
// 显示默认的编辑表单
showForm();
}
}
这段代码中重要的部分是textile(sql[0].content)这个小片段,它从数据结构中抓取wiki修订文本后运行Textile格式器。与HTML一样,Textile也是一种标记内容的方式。Textile非常简单,只提供基本的、容易理解的格式化标记,任何人都可以轻松上手。一个Textile格式化的例子如图13-3所示。

图13-3 使用Textile格式化后的wiki修订
Textile优秀的一面还在于,有人经过努力的工作创建了一个Textile JavaScript库,它能够将Textile格式的文本转换成最终可发布和展现的HTML。关于Textile更多的信息可以在以下网站找到:
l Textile概览:http://www.textism.com/tools/textile/。
l JavaScript Textile实现(在这个项目中用到):http://jrm.cc/extras/live-textile-preview.php。
格式化从服务器返回的数据并插入到文档中后,你已经完成了整个wiki。建议你架设自己的wiki代码并运行。代码已经有足够多的注释,因此这个操练的应该很轻松。






