重写yii的cjson为wjson输出model支持自定义变量
因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 '';
}
}
}
