精做高難度防水抓漏/壁癌/油漆等工程
責任施工、合約保固!
招牌專業鋁門窗、鍛造門設計及安裝
價格便宜、品質好、設計佳,值得您信賴

首頁  •  j2h 論壇 • 程式設計討論     • 

[php] 無法執行的 json_encode()

房東:蛙蛙
發表時間:2011-04-19


無法執行的 json_encode()


在PHP版本5.2.0之前,json_encode函式是不存在的,通常會發生這種情況最常見的原因就是所承租的主機所提供的PHP版本太舊,最近有在使用AJAX技術的人,想必一定會用到此函式,幸虧已經有高手Michal Migurski寫好這個好用的類別JSON.php,他的使用方法如下:





  1.   

  2. //載入JSON編碼類別   

  3. include_once('JSON.php');   

  4.   

  5. //建立JSON編碼物件   

  6. $json = new Services_JSON();   

  7.   

  8. //假設陣列資料   

  9. $data = array(   

  10.     123,   

  11.     '中文',   

  12.     'key' => 'value',   

  13.     array(1,2,3)   

  14. );   

  15.   

  16. //輸出編碼後的資料   

  17. echo $json->encode($data);   

  18.   

  19. //中文字碼會被自動轉換unicode的編碼   

  20. //輸出結果:{"0":123,"1":"\u4e2d\u6587","key":"value","2":[1,2,3]}   

  21.   

  22. //解碼範例   

  23. $jsonData = $GLOBALS['HTTP_RAW_POST_DATA'];   

  24. echo $json->decode($jsonData);  




你是否有發現,輸出結果的內容,是沒有斷行的,所有字串合成一行,這樣的格式並不方便閱讀,所以我來到PHP官方挖寶,果然json_encode函式下列補充回應內容中,就有其它PHP大師,由umbrae所提供了一個將json資料格式化的函式json_format(),可將json資料編排更容易閱讀的格式。





  1.   

  2. /*****************************************  

  3. * 程式碼作者:umbrae  

  4. * 程式碼來源:http://tw.php.net/json_encode  

  5. * 程式碼說明:將JSON資料轉為可閱讀排版  

  6. ******************************************/  

  7. function json_format($json) {   

  8.     $tab = "  ";   

  9.     $new_json = "";   

  10.     $indent_level = 0;   

  11.     $in_string = false;   

  12.     $json_obj = json_decode($json);   

  13.     if(!$json_obj){   

  14.         return false;   

  15.     }   

  16.     $json = json_encode($json_obj);   

  17.     $len = strlen($json);   

  18.     for($c = 0; $c < $len$c++) {   

  19.         $char = $json[$c];   

  20.         switch($char) {   

  21.             case '{':   

  22.             case '[':   

  23.                 if(!$in_string) {   

  24.                     $new_json .= $char . "\n" . str_repeat($tab$indent_level+1);   

  25.                     $indent_level++;   

  26.                 } else {   

  27.                     $new_json .= $char;   

  28.                 }   

  29.             break;   

  30.             case '}':   

  31.             case ']':   

  32.                 if(!$in_string){   

  33.                     $indent_level--;   

  34.                     $new_json .= "\n" . str_repeat($tab$indent_level) . $char;   

  35.                 } else {   

  36.                     $new_json .= $char;   

  37.                 }   

  38.             break;   

  39.             case ',':   

  40.                 if(!$in_string){   

  41.                     $new_json .= ",\n" . str_repeat($tab$indent_level);   

  42.                 } else {   

  43.                     $new_json .= $char;   

  44.                 }   

  45.             break;   

  46.             case ':':   

  47.                 if(!$in_string) {   

  48.                     $new_json .= ": ";   

  49.                 } else {   

  50.                     $new_json .= $char;   

  51.                 }   

  52.             break;   

  53.             case '"':   

  54.                 $in_string = !$in_string;   

  55.             default:   

  56.                 $new_json .= $char;   

  57.             break;   

  58.         }   

  59.     }   

  60.     return $new_json;   

  61. }   

  62.   

  63. /******************  

  64. * 排版後的輸出結果  

  65. *******************  

  66. {  

  67.   "0": 123,  

  68.   "1": "\u4e2d\u6587",  

  69.   "key": "value",  

  70.   "2": [  

  71.     1,  

  72.     2,  

  73.     3  

  74.   ]  

  75. }  

  76. */  




不過在這邊特別要注意的是,json_format()中的第11行和第15行使用了json_decode()和json_encode()的函式,如果在PHP5.2.0環境下當然是正常,不過如果我們使用的是外部載入JSON.php函式,你必需將這兩行做稍微的修改(例如改為靜態用法 Services_JSON::decode和Services_JSON::encode,才行正常的使用。不過最好再另外先一個類別來使用會更為方便。例如





  1.   

  2. /*****************************************  

  3. * 程式合併者:liaosankai  

  4. * 原程式碼來源:http://tw.php.net/json_encode  

  5. *             http://mike.teczno.com/JSON/JSON.phps  

  6. * 程式碼說明:JSON.php強化版  

  7. ******************************************/  

  8. include_once('JSON.php');   

  9. class JSON extends Services_JSON {   

  10.     //===============   

  11.     //強化encode函式   

  12.     //===============   

  13.     function encode($var,$format=false){   

  14.         $json = parent::encode($var);   

  15.         if($format == false){   

  16.             return $json;   

  17.         } else {   

  18.             return $this->json_format($json);   

  19.         }   

  20.     }   

  21.     //=======================   

  22.     // 將JSON資料轉為可閱讀排版   

  23.     //=======================   

  24.     function json_format($json) {   

  25.         //程式碼省略,但請注意!!   

  26.         //必需將json_decode($json)改為$this->decode($json);   

  27.         //必需將json_encode($json)改為$this->enecode($json);   

  28.     }   

  29. }  




如此一來使用$json->encode()只要多追加一個參數,就可以決定是否要以格式化方法回傳了,你可以在此下載已改寫過的JSON.php檔,注意在建立物件時,已變成$json = new JSON()了


注意!!最近我在使用大量資料時,發現json_format()無法運作了。後來查到主因來至於 json_format()的第15行 $json = json_encode($json_obj);,原作者似乎進行了一個多餘的動作,又將json再編碼一次,這行程式使得在進行大量資料轉換時會產生逾時的不明錯誤,故將此行拿掉,就可以正常運作了。





  • 贊助網站       

    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務
    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!

  • 1 樓住戶:蛙蛙
    發表時間:2011-04-19


    例 1. A json_encode() example









    $arr
    = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5
    );



    echo
    json_encode($arr
    );

    ?>

    上例將輸出:









    {"a":1,"b":2,"c":3,"d":4,"e":5}







    解碼範例  .使用 JSON.php改為









    <?php


    //載入JSON編碼類別  

    include_once('JSON.php');  

     

    //建立JSON編碼物件  

    $json = new Services_JSON();
      




    $arr
    = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5
    );



    echo
    $json->encode($arr
    );

    ?>







     共 1 人回應  選擇頁數 【第1 頁】 

    姓名:
    佈告內容:
    其他選項: