作者:株洲市网商会 | 来源:互联网 | 2018-03-20 12:57
重写YII的CJSON为WJSON输出model支持自定义变量
因YII的CJSON输出model时只能输出attributes变量,不能输出自定义变量,重新此类使之可以输出自定义变量
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 .= &#39;\b&#39;;
break;
case $ord_var_c == 0x09:
$ascii .= &#39;\t&#39;;
break;
case $ord_var_c == 0x0A:
$ascii .= &#39;\n&#39;;
break;
case $ord_var_c == 0x0C:
$ascii .= &#39;\f&#39;;
break;
case $ord_var_c == 0x0D:
$ascii .= &#39;\r&#39;;
break;
case $ord_var_c == 0x22:
case $ord_var_c == 0x2F:
case $ord_var_c == 0x5C:
// double quote, slash, slosh
$ascii .= &#39;\\&#39; . $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(&#39;C*&#39;, $ord_var_c, ord($var{$c + 1}));
$c += 1;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf(&#39;\u%04s&#39;, 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(&#39;C*&#39;, $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}));
$c += 2;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf(&#39;\u%04s&#39;, 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(&#39;C*&#39;, $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}));
$c += 3;
$utf16 = self::utf8ToUTF16BE($char);
$ascii .= sprintf(&#39;\u%04s&#39;, 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(&#39;C*&#39;, $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(&#39;\u%04s&#39;, 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(&#39;C*&#39;, $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(&#39;\u%04s&#39;, bin2hex($utf16));
break;
}
}
return &#39;"&#39; . $ascii . &#39;"&#39;;
case &#39;array&#39;:
// treat as a JSON object
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
return &#39;{&#39; .
join(&#39;,&#39;, array_map(array(&#39;WJSON&#39;, &#39;nameValue&#39;),
array_keys($var),
array_values($var)))
. &#39;}&#39;;
}
// treat it like a regular array
return &#39;[&#39; . join(&#39;,&#39;, array_map(array(&#39;WJSON&#39;, &#39;encode&#39;), $var)) . &#39;]&#39;;
case &#39;object&#39;:
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 &#39;{&#39; .
join(&#39;,&#39;, array_map(array(&#39;WJSON&#39;, &#39;nameValue&#39;),
array_keys($vars),
array_values($vars)))
. &#39;}&#39;;
default:
return &#39;&#39;;
}
}
}