Commit 22134018 authored by Falko Timme's avatar Falko Timme
Browse files

- Modified json_encode function for PHP < 5.2.0.

parent 2f4ff71a
......@@ -111,38 +111,64 @@ class functions {
function json_encode($data) {
if(!function_exists('json_encode')){
switch ($type = gettype($data)){
case 'NULL':
return 'null';
case 'boolean':
return ($data ? 'true' : 'false');
case 'integer':
case 'double':
case 'float':
return $data;
case 'string':
return '"' . addslashes($data) . '"';
case 'object':
$data = get_object_vars($data);
case 'array':
$output_index_count = 0;
$output_indexed = array();
$output_associative = array();
foreach($data as $key => $value){
$output_indexed[] = $this->json_encode($value);
$output_associative[] = $this->json_encode($key) . ':' . $this->json_encode($value);
if($output_index_count !== NULL && $output_index_count++ !== $key){
$output_index_count = NULL;
}
if(is_array($data) || is_object($data)){
$islist = is_array($data) && (empty($data) || array_keys($data) === range(0,count($data)-1));
if($islist){
$json = '[' . implode(',', array_map(array($this, "json_encode"), $data) ) . ']';
} else {
$items = Array();
foreach( $data as $key => $value ) {
$items[] = $this->json_encode("$key") . ':' . $this->json_encode($value);
}
if($output_index_count !== NULL){
return '[' . implode(',', $output_indexed) . ']';
} else {
return '{' . implode(',', $output_associative) . '}';
$json = '{' . implode(',', $items) . '}';
}
} elseif(is_string($data)){
# Escape non-printable or Non-ASCII characters.
# I also put the \\ character first, as suggested in comments on the 'addclashes' page.
$string = '"'.addcslashes($data, "\\\"\n\r\t/".chr(8).chr(12)).'"';
$json = '';
$len = strlen($string);
# Convert UTF-8 to Hexadecimal Codepoints.
for($i = 0; $i < $len; $i++){
$char = $string[$i];
$c1 = ord($char);
# Single byte;
if($c1 <128){
$json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
continue;
}
default:
return ''; // Not supported
# Double byte
$c2 = ord($string[++$i]);
if(($c1 & 32) === 0){
$json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
continue;
}
# Triple
$c3 = ord($string[++$i]);
if(($c1 & 16) === 0){
$json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
continue;
}
# Quadruple
$c4 = ord($string[++$i]);
if(($c1 & 8) === 0){
$u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
$w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
$w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
$json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
}
}
} else {
# int, floats, bools, null
$json = strtolower(var_export($data, true));
}
return $json;
} else {
return json_encode($data);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment