人一生这一辈子,能记住多少事?还是写下来的好。 注册 | 登陆
浏览模式: 标准 | 列表2010年01月的文章

今天自个儿写了个jsonDecode的函数来替代PHP的json_decode

PHP代码
  1. //将内容进行UNICODE编码   
  2. function unicode_encode($name)   
  3. {   
  4.     $name = iconv('UTF-8''UCS-2'$name);   
  5.     $len = strlen($name);   
  6.     $str = '';   
  7.     for ($i = 0; $i < $len - 1; $i = $i + 2)   
  8.     {   
  9.         $c = $name[$i];   
  10.         $c2 = $name[$i + 1];   
  11.         if (ord($c) > 0)   
  12.         {   //两个字节的文字   
  13.             $str .= '\u'.base_convert(ord($c), 10, 16).base_convert(ord($c2), 10, 16);   
  14.         }   
  15.         else  
  16.         {   
  17.             $str .= $c2;   
  18.         }   
  19.     }   
  20.     return $str;   
  21. }   
  22.   
  23. //将UNICODE编码后的内容进行解码   
  24. function unicode_decode($name)   
  25. {   
  26.     //转换编码,将Unicode编码转换成可以浏览的utf-8编码   
  27.     $pattern = '/(\\\u([\w]{4}))/i';   
  28.     $name = preg_replace_callback( $pattern , '_unicode_decode' , $name );   
  29.     return $name;   
  30. }   
  31.   
  32. function _unicode_decode( $str ) {   
  33.     $str = $str[0];   
  34.     $name = '';   
  35.     $code = base_convert(substr($str, 2, 2), 16, 10);   
  36.     $code2 = base_convert(substr($str, 4), 16, 10);   
  37.     $c = chr($code).chr($code2);   
  38.     $c = iconv('UCS-2''UTF-8'$c);   
  39.     $name .= $c;   
  40.   
  41.     return $name;   
  42. }   
  43.   
  44.   
  45. function jsonDecode( $json , $to_encode = 'gbk' , & $i = 0 ) {   
  46.     if ( null === $i ) {   
  47.         $i = 0;   
  48.     }   
  49.   
  50.     for( ; $i < strlen$json ) ; $i ++ ) {        
  51.         $chr = $json[$i];   
  52.   
  53.         switch$chr ) {   
  54.             case '"' :   
  55.             case "'" :  
  56.                 //字符串         
  57.                 $i ++;  
  58.                 $val = '';  
  59.                 while( $json[$i] != $chr || $lastChr == '\\' ) {  
  60.                     $lastChr = $json[$i];  
  61.                     $val .= $lastChr;  
  62.                     $i ++;  
  63.                       
  64.                 }  
  65.                 ++ $i;  
  66.                   
  67.                 //字符串处理  
  68.                   
  69.                 //unicode 转汉字  
  70.                 $val = unicode_decode( $val );  
  71.                 if ( strtolower( str_ireplace( '-' , '' , $to_encode ) ) !== 'utf8' ) {  
  72.                     $val = mb_convert_encoding( $val , $to_encode , 'utf-8' );  
  73.                 }  
  74.                 $val = stripslashes( $val );                  
  75.                 return $val;  
  76.                 break;  
  77.             case 'a' :  
  78.             case 'b' :  
  79.             case 'c' :  
  80.             case 'd':  
  81.             case 'e':  
  82.             case 'f':  
  83.             case 'g':  
  84.             case 'h':  
  85.             case 'i':  
  86.             case 'j':  
  87.             case 'k':  
  88.             case 'l':  
  89.             case 'm':  
  90.             case 'n':  
  91.             case 'o':  
  92.             case 'p':  
  93.             case 'q':  
  94.             case 'r':  
  95.             case 's':  
  96.             case 't':  
  97.             case 'u':  
  98.             case 'v':  
  99.             case 'w':  
  100.             case 'x':  
  101.             case 'y':  
  102.             case 'z':  
  103.             case 'A' :  
  104.             case 'B' :  
  105.             case 'C' :  
  106.             case 'D':  
  107.             case 'E':  
  108.             case 'F':  
  109.             case 'G':  
  110.             case 'H':  
  111.             case 'I':  
  112.             case 'J':  
  113.             case 'K':  
  114.             case 'L':  
  115.             case 'M':  
  116.             case 'N':  
  117.             case 'O':  
  118.             case 'P':  
  119.             case 'Q':  
  120.             case 'R':  
  121.             case 'S':  
  122.             case 'T':  
  123.             case 'U':  
  124.             case 'V':  
  125.             case 'W':  
  126.             case 'X':  
  127.             case 'Y':  
  128.             case 'Z':     
  129.             case '0':  
  130.             case '1':  
  131.             case '2':  
  132.             case '3':  
  133.             case '4':  
  134.             case '5':  
  135.             case '6':  
  136.             case '7':  
  137.             case '8':  
  138.             case '9':  
  139.               
  140.                 //字符串  
  141.                 if ( trim( $chr ) === '' ) {  
  142.                     continue;  
  143.                 }  
  144.                 $val = $chr;  
  145.                 while( preg_match( '#^[a-zA-Z0-9\.]$#' , $json[++$i] ) ) {  
  146.                     $val .= $json[$i];                                    
  147.                 }  
  148.                 $lVal = strtolower( $val );  
  149.                 if ( $lVal == 'true' ) {  
  150.                     return true;  
  151.                 }  
  152.                 if ( $lVal == 'false' ) {  
  153.                     return false;  
  154.                 }  
  155.                 if ( preg_match( '#^[0-9\.]+$#' , $lVal ) ) {  
  156.                     return $val + 0;  
  157.                 }  
  158.                 return $val;  
  159.             case '{' :  
  160.                 $val = array();  
  161.                 $i ++;  
  162.                 $key = '';  
  163.                 while( $json[$i] != '}' ) {  
  164.                     $key .= $json[$i];  
  165.                     $i ++;  
  166.                     if ( $json[$i] == ':' ) {  
  167.                         $key = ltrim( $key );  
  168.                         $key = ltrim( $key , ',' ); //去除,  
  169.                         $key = trim( $key );//去两边的空白  
  170.                         if ( preg_match( '#^"(.+?)"$#' , $key , $m ) ) {  
  171.                             $key = $m[1];  
  172.                         }  
  173.                         if ( preg_match( '#^\'(.+?)\'$#' , $key , $m ) ) {   
  174.                             $key = $m[1];   
  175.                         }   
  176.                         ++ $i;   
  177.                         $val[$key] = jsonDecode( $json , $to_encode , $i );   
  178.                         $key = '';                         
  179.                     }                      
  180.                 }   
  181.                 ++ $i;   
  182.                 return $val;   
  183.                 break;   
  184.             case '[' :   
  185.                 $val = array();   
  186.                 $i ++;   
  187.                 $t = 0;   
  188.                 while$json[$i] != ']' ) {   
  189.                     if ( $json[$i] == ',' ) {   
  190.                         $i ++;   
  191.                         continue;   
  192.                     }                      
  193.                     $val[] = jsonDecode( $json , $to_encode  , $i );                       
  194.                    
  195.                 }   
  196.                    
  197.                 $i ++;   
  198.                 return $val;   
  199.                 break;   
  200.         }   
  201.     }   
  202.     return NULL ;   
  203. }   

 

用法:

 

PHP代码
  1. $array_gbk = jsonDecode( $jsonString );   
  2.   
  3. $array_utf8 = jsonDecode( $jsonString , 'utf-8' );   

[转]定义一个javascript类

今天使用zendstudio时,发现我以往的json的写法不支持,便重新找了下JS类定义的文章。便保存了下来。

» 阅读全文

Tags: javascript,