重写YII的CJSON为WJSON输出model支持自定义变量 因YII的CJSON输出model时只能输出attributes变量,不能输出自定义变量,重新此类使之可以输出自定义变量 ?php /** * @author 王亚超 * 重写YII的CJSO
因YII的CJSON输出model时只能输出attributes变量,不能输出自定义变量,重新此类使之可以输出自定义变量
<?php
/**
* @author 王亚超
* 重写YII的CJSON为WJSON输出model支持自定义变量
* Class WJSON
*/
class WJSON extends CJSON {
protected static function nameValue($name, $value) {
return self::encode(strval($name)) . ':' . self::encode($value);
}
public static function encode($var) {
switch (gettype($var)) {
case 'boolean':
return $var ? 'true' : 'false';
case 'NULL':
return 'null';
case 'integer':
return (int)$var;
case 'double':
case 'float':
return str_replace(',', '.', (float)$var); // locale-independent representation
case 'string':
if (($enc = strtoupper(Yii::app()->charset)) !== 'UTF-8')
$var = iconv($enc, 'UTF-8', $var);
if (function_exists('json_encode'))
return json_encode($var);
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
$ascii = '';
$strlen_var = strlen($var);
/*
* Iterate over every character in the string,
* escaping with a slash or encoding to UTF-8 where necessary
*/
for ($c = 0; $c < $strlen_var; ++$c) {
$ord_var_c = ord($var{$c});
switch (true) {
case $ord_var_c == 0x08:
$ascii .= '\\b';
break;
case $ord_var_c == 0x09:
$ascii .= '\\t';
break;
case $ord_var_c == 0x0A:
$ascii .= '\\n';
break;
case $ord_var_c == 0x0C:
$ascii .= '\\f';
break;
case $ord_var_c == 0x0D:
$ascii .= '\\r';
break;
case $ord_var_c == 0x22:
case $ord_var_c == 0x2F:
case $ord_var_c == 0x5C:
// double quote, slash, slosh
$ascii .= '\\\\' . $var{$c};
break;
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII)
$ascii .= $var{$c};
break;
case (($ord_var_c & 0xE0) == 0xC0):
// characters U-00000080 - U-000007FF, mask 110XXXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, ord($var{$c + 1}));
$c += 1;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf('\\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xF0) == 0xE0):
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}));
$c += 2;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf('\\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xF8) == 0xF0):
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}));
$c += 3;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf('\\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xFC) == 0xF8):
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}));
$c += 4;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf('\\u%04s', bin2hex($utf16));
break;
case (($ord_var_c & 0xFE) == 0xFC):
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}),
ord($var{$c + 5}));
$c += 5;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf('\\u%04s', bin2hex($utf16));
break;
}
}
return '"' . $ascii . '"';
case 'array':
// treat as a JSON object
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
return '{' .
join(',', array_map(array('WJSON', 'nameValue'),
array_keys($var),
array_values($var)))
. '}';
}
// treat it like a regular array
return '[' . join(',', array_map(array('WJSON', 'encode'), $var)) . ']';
case 'object':
if ($var instanceof Traversable) {
$vars = array();
foreach ($var as $k => $v)
$vars[$k] = $v;
} else
$vars = get_object_vars($var);
// related
foreach ($var->relations() as $key => $related) {
if ($var->hasRelated($key)) {
$vars[$key] = $var->$key;
}
}
return '{' .
join(',', array_map(array('WJSON', 'nameValue'),
array_keys($vars),
array_values($vars)))
. '}';
default:
return '';
}
}
}
