| | |
| | | |
| | | 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); |
| | | } |