PageRenderTime 45ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/system/helper/json.php

https://bitbucket.org/jjasko/opencart_serbian
PHP | 135 lines | 95 code | 33 blank | 7 comment | 12 complexity | fa1e4fee2619c32eea0d802504174782 MD5 | raw file
  1. <?php
  2. if (!function_exists('json_encode')) {
  3. function json_encode($data) {
  4. switch (gettype($data)) {
  5. case 'boolean':
  6. return $data ? 'true' : 'false';
  7. case 'integer':
  8. case 'double':
  9. return $data;
  10. case 'resource':
  11. case 'string':
  12. # Escape non-printable or Non-ASCII characters.
  13. # I also put the \\ character first, as suggested in comments on the 'addclashes' page.
  14. $json = '';
  15. $string = '"' . addcslashes($data, "\\\"\n\r\t/" . chr(8) . chr(12)) . '"';
  16. # Convert UTF-8 to Hexadecimal Codepoints.
  17. for ($i = 0; $i < strlen($string); $i++) {
  18. $char = $string[$i];
  19. $c1 = ord($char);
  20. # Single byte;
  21. if ($c1 < 128) {
  22. $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
  23. continue;
  24. }
  25. # Double byte
  26. $c2 = ord($string[++$i]);
  27. if (($c1 & 32) === 0) {
  28. $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
  29. continue;
  30. }
  31. # Triple
  32. $c3 = ord($string[++$i]);
  33. if (($c1 & 16) === 0) {
  34. $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
  35. continue;
  36. }
  37. # Quadruple
  38. $c4 = ord($string[++$i]);
  39. if (($c1 & 8 ) === 0) {
  40. $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
  41. $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
  42. $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
  43. $json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
  44. }
  45. }
  46. return $json;
  47. case 'array':
  48. if (empty($data) || array_keys($data) === range(0, sizeof($data) - 1)) {
  49. $output = array();
  50. foreach ($data as $value) {
  51. $output[] = json_encode($value);
  52. }
  53. return '[' . implode(',', $output) . ']';
  54. }
  55. case 'object':
  56. $output = array();
  57. foreach ($data as $key => $value) {
  58. $output[] = json_encode(strval($key)) . ':' . json_encode($value);
  59. }
  60. return '{' . implode(',', $output) . '}';
  61. default:
  62. return 'null';
  63. }
  64. }
  65. }
  66. if (!function_exists('json_decode')) {
  67. function json_decode($json, $assoc = false) {
  68. $match = '/".*?(?<!\\\\)"/';
  69. $string = preg_replace($match, '', $json);
  70. $string = preg_replace('/[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/', '', $string);
  71. if ($string != '') {
  72. return null;
  73. }
  74. $s2m = array();
  75. $m2s = array();
  76. preg_match_all($match, $json, $m);
  77. foreach ($m[0] as $s) {
  78. $hash = '"' . md5($s) . '"';
  79. $s2m[$s] = $hash;
  80. $m2s[$hash] = str_replace('$', '\$', $s);
  81. }
  82. $json = strtr($json, $s2m);
  83. $a = ($assoc) ? '' : '(object) ';
  84. $data = array(
  85. ':' => '=>',
  86. '[' => 'array(',
  87. '{' => "{$a}array(",
  88. ']' => ')',
  89. '}' => ')'
  90. );
  91. $json = strtr($json, $data);
  92. $json = preg_replace('~([\s\(,>])(-?)0~', '$1$2', $json);
  93. $json = strtr($json, $m2s);
  94. $function = @create_function('', "return {$json};");
  95. $return = ($function) ? $function() : null;
  96. unset($s2m);
  97. unset($m2s);
  98. unset($function);
  99. return $return;
  100. }
  101. }
  102. ?>