作为数据结构,纯文本和HTML只适用于特定场合,但它们可以节省客户端CPU周期。XML被广泛应用而且支持良好,但是它十分笨重且解析缓慢。JSON是轻量级的,解析速度快,通用性与XML相当。字符分割的自定义格式十分轻量,在解析大量数据集时非常快,但需要编写额外的服务端构造程序,并在客户端解析。
- XML
在高性能AJAX中XML没有立足之地
第一种格式:
<users total='2'>
<user id='1'>
<username>zhangsan</username>
<realname>lisan</realname>
<age>23</age>
</user>
<user id='2'>
<username>wangwu</username>
<realname>xiaoliu</realname>
<age>23</age>
</user>
</users>
第二种格式:
<users total='2'>
<user id='1' username='zhangsan' realname='lisan' />
<user id='2' username='wangwu' realname='xiaoliu' />
</users>
2. Xpath 未得到广泛的支持
3. JSON
是一种使用JavaScript对象和数组直接量编写的轻量级且易于解析的数据格式。
JSON要求名称和值必须包含在双引号中(数字除外)。不允许使用单引号。
JSON不是JavaScript
服务器端对于前端设计人员来说较为神秘,先贴上服务器端代码
$users = array();
$users['aa'] = array('id'=>1, 'name'=>'mackxu', 'age'=>23);
$users['bb'] = array('id'=>2, 'name'=>'anan', 'age'=>20);
$users['cc'] = array('id'=>3, 'name'=>'张三', 'age'=>23);
header("Content-type:text/json;charset=utf-8");
//编码$users为json格式的数据
//[{"id":1,"name":"mackxu","age":23},{"id":2,"name":"anan","age":20},
//{"id":3,"name":"zhangsan","age":23}]
echo json_encode($users);
JS代码请求数据,显示在网页上:
//请求json格式的数据
function request_json() {
var oXHR = new XMLHttpRequest();
var url = '../test/index.php';
oXHR.open('GET', url, true);
oXHR.onreadystatechange = function() {
if(oXHR.readyState == 4) {
if(oXHR.status==200 || oXHR.status==304) {
handler_user(oXHR.responseText);
}
}
};
oXHR.send(null);
}
//处理服务器响应的数据
function handler_user(json) {
var oUser = parse_json(json);
//处理数据 打印所有数据
for (var id in oUser) {
console.log(id);
for (var p in oUser[id]) {
console.log(oUser[id][p]);
}
}
}
//解析Json字符串
function parse_json(json) {
return eval('('+json+')');
}
数组JSON格式:
//[["1","mackxu","23"],["2","anan","20"],["3","\u5f20\u4e09","20"]]
$users = array(
array('1', 'mackxu', '23'),
array('2', 'anan', '20'),
array('3', '张三', '20')
);
4. JSON-P
JSON可以被本地执行前需要做适当的处理,当使用XHR是,JSON数据被当成字符串返回。字符串紧接着被eval()转换成原生对象。然而在使用动态脚本注入时,JSON数据被当成另一个JavaScript文件并作为原生代码执行。为了实现这一点,这些数据必须封装在一个回调函数里。(JSON with padding) JSON填充
照样先贴上服务器端的数据:
header("Content-type:text/javascript; charset=utf-8");
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
//[["1","mackxu","23"],["2","anan","20"],["3","\u5f20\u4e09","20"]]
$users = array(
array('1', 'mackxu', '23'),
array('2', 'anan', '20'),
array('3', '张三', '20')
);
if (isset($_GET['callback'])) {
$callback = $_GET['callback']; //JS回调函数名称
//对数据json编码
$json = json_encode($users);
//拼接json-p数据, 并输出
echo $callback.'('.$json.');';
}
jS文件代码:
//动态加载脚本, 请求JSON-P数据
function load_script(url) {
var oScript = document.createElement('script');
oScript.type = 'text/javascript';
oScript.src = url; //此处有请求
document.getElementsByTagName('head')[0].appendChild(oScript);
}
//定义回调函数:处理json数据
function hander_json(oData) {
console.log(oData);
}
//click事件的处理器
function hander() {
var url = '../test/index.php?callback=hander_json';
load_script(url); //根据url请求脚本
}
5. HTML格式
服务器端创建好的HTML 传输数量大、还需要时间在客户端解析
6. 自定义格式
理想的数据格式应该只包含必要的结构,以便可以分解出每一个独立的字段。我们很容易定义这样的格式,只需要简单地把数据用分隔符连接起来:
1:mackxu:23:ecjtu;
2:anan:20:ecjtu;
... ...
服务端代码:
$users = array(
array('id'=>1, 'name'=>'mackxu', 'age'=>23),
array('id'=>2, 'name'=>'anan', 'age'=>20),
array('id'=>3, 'name'=>'张三', 'age'=>22)
);
//返回自定义格式化后的字符串
function build_format_custom($users) {
$row_delimiter = chr(1); //js中的\u0001
$field_delimiter = chr(2); //\u0002
foreach ($users as &$user) {
$value = implode($field_delimiter, $user);
}
return implode($row_delimiter, $users);
}
function build_format_custom2($users) {
$row_delimiter = chr(1); //js中的\u0001
$field_delimiter = chr(2); //\u0002
$output = array();
foreach ($users as $user) {
$fields = array($user['id'], $user['name'], $user['age']);
$output[] = implode($field_delimiter, $fields);
}
return implode($row_delimiter, $output);
}
//输出自定义分割的字符串
echo build_format_custom($users);
客户端JS请求数据:
//自定义格式的数据请求、处理 function request_data() { var oXHR = new XMLHttpRequest(); var url = '../test/index.php'; oXHR.open('GET', url, true); oXHR.send(null); oXHR.onreadystatechange = function() { if(oXHR.readyState == 4) { if(oXHR.status==200 || oXHR.status==304) { //处理响应的数据 handle_data(oXHR.responseText); } } }; } //把数据解析成每个用户是一个对象并把它放在数组里 //'\u0001'、'\u0002'是约定的分隔符 function parse_custom_format(sData) { var aUsers = []; //对象数组存储所有用户对象 var usersEncode = sData.split('\u0001'); var aUser; for(var i=0, len=usersEncode.length; i<len; i++) { aUser = usersEncode[i].split('\u0002'); aUsers[i] = { id: aUser[0], name: aUser[1], sex: aUser[2] }; } return aUsers; //返回对象数组 } //处理服务器端响应的数据 function handle_data(sData) { var aUsers = parse_custom_format(sData); console.log(aUsers); }
数据格式总结
通常来说数据格式越轻量级越好,JSON和字符分割的自定义格式是最好的。如果数据集很大并且对解析时间有要求,那么可以选择下面这两种格式:
- JSON-P数据,使用动态脚本注入获取。
它把数据当作可执行JS代码而不是字符串,解析速度极快。它能跨域使用,但不安全
2. 字符分割的自定义格式
使用XHR或动态脚本注入获取,用split()解析。解析大数据比JSON-P略快,而且通常文件尺寸更小
浙公网安备 33010602011771号