PHP兼容低版本和高版本的json数据处理类
json数据格式是当下比较流行的一种, 比起xml来,json格式更易用简单. 同时,与javascript配合起来可以说是最佳的数据交换格式. 在php 5.2以上版本,已经支持json的解析了,但是在php 5.2一下就不被支持了. 下面这个类可以实现兼容json_encode函数, 在高版本上,使用自带函数解析,低版本使用自定义函数解析,相信这种功能对PHP开发者来说很实用.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/* * 作者: 雪狐博客 */ final class Json {
static public function encode($data) {
if (function_exists('json_encode')) {
return json_encode($data);
} else {
switch (gettype($data)) {
case 'boolean':
return $data ? 'true' : 'false';
case 'integer':
case 'double':
return $data;
case 'resource':
case 'string':
return '"' . str_replace(array("\r", "\n", "<", ">", "&"), array('\r', '\n', '\x3c', '\x3e', '\x26'), addslashes($data)) . '"';
case 'array':
if (empty($data) || array_keys($data) === range(0, sizeof($data) - 1)) {
$output = array();
foreach ($data as $value) {
$output[] = Json::encode($value);
}
return '[ ' . implode(', ', $output) . ' ]';
}
case 'object':
$output = array();
foreach ($data as $key => $value) {
$output[] = Json::encode(strval($key)) . ': ' . Json::encode($value);
}
return '{ ' . implode(', ', $output) . ' }';
default:
return 'null';
}
}
}
static public function decode($json, $assoc = FALSE) {
if (function_exists('json_decode')) {
return json_decode($json);
} else {
$match = '/".*?(?<!\\\\)"/';
$string = preg_replace($match, '', $json);
$string = preg_replace('/[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/', '', $string);
if ($string != '') {
return NULL;
}
$s2m = array();
$m2s = array();
preg_match_all($match, $json, $m);
foreach ($m[0] as $s) {
$hash = '"' . md5($s) . '"';
$s2m[$s] = $hash;
$m2s[$hash] = str_replace('$', '\$', $s);
}
$json = strtr($json, $s2m);
$a = ($assoc) ? '' : '(object) ';
$data = array(
':' => '=>',
'[' => 'array(',
'{' => "{$a}array(",
']' => ')',
'}' => ')'
);
$json = strtr($json, $data);
$json = preg_replace('~([\s\(,>])(-?)0~', '$1$2', $json);
$json = strtr($json, $m2s);
$function = @create_function('', "return {$json};");
$return = ($function) ? $function() : NULL;
unset($s2m);
unset($m2s);
unset($function);
return $return;
}
}
} |