2010-02-27 121 views
36

我想通過json_decode()解析時處理壞的json數據。我使用下面的腳本:在PHP json_decode()中檢測錯誤的json數據?

if(!json_decode($_POST)) { 
    echo "bad json data!"; 
    exit; 
} 

如果$ _ POST等於:

'{ bar: "baz" }' 

然後json_decode處理錯誤,罰款和吐出; 「壞JSON數據!」 但是,如果我設置$ _ POST以類似「無效數據」,它給了我:

Warning: json_decode() expects parameter 1 to be string, array given in C:\server\www\myserver.dev\public_html\rivrUI\public_home\index.php on line 6 
bad json data! 

我是否需要寫一個自定義腳本來檢測有效的JSON數據,或者是有檢測其他一些巧妙的方法這個?

+0

'$ _POST'總是一個數組c保留通過POST傳遞的* x-www-form-urlencoded *參數。你如何將你的數據發送到你的PHP腳本? – Gumbo 2010-02-27 16:58:45

+0

PHP中包含的json函數沒有多大幫助。他們有很多問題。看看[json.org](http://json.org/)找到一個好的圖書館。 – whiskeysierra 2010-02-27 17:02:00

回答

82

這裏有一個關於json_decode幾件事情:

  • 它返回的數據,或者null時出現錯誤
  • 它也可以返回null時沒有錯誤:當JSON字符串包含null
  • 它會在出現警告時發出警告 - 警告您要消失。


爲了解決這個問題的警告,一個解決方案是使用@ operator(我不經常建議使用它,因爲它使調試運行了很多困難......但在這裏,沒有多少選擇的餘地)

$_POST = array(
    'bad data' 
); 
$data = @json_decode($_POST); 

你會再要測試是否$datanull - 和,避免了情況,其中json_decode回報nullnull在JSON字符串,可以ç赫克json_last_error,這(引用)

返回的最後一個錯誤(如果有的話)發生在去年JSON解析 。


這意味着你必須用一些類似於下面的代碼:

if ($data === null 
    && json_last_error() !== JSON_ERROR_NONE) { 
    echo "incorrect data"; 
} 
10

您還可以使用json_last_error:http://php.net/manual/en/function.json-last-error.php

其作爲文檔說:

返回上次JSON期間發生的最後一個錯誤(如果有的話) 編碼/解碼。

這裏有一個例子

+6

在http://php.net/manual/en/function.json-last-error-msg.php中,這在PHP 5.5中是完全不必要的 – vvondra 2015-03-04 00:16:00

1

我剛剛打破了我的頭以上的似乎是完美的JSON一個JSON語法錯誤:{「測試1」:「汽車」,「測試2」:「汽車「}從一個url編碼的字符串。

但在我的情況下,以上的一些是HTML編碼,因爲添加html_entity_decode($string)做了伎倆。

$ft = json_decode(html_entity_decode(urldecode(filter_input(INPUT_GET, 'ft', FILTER_SANITIZE_STRING)))); 

希望這會爲別人節省一些時間。

1

/** * * 定製json_decode *手柄json_decode錯誤 * * @參數類型$ json_text * @返回類型 */ 公共靜態功能custom_json_decode($ json_text){

$decoded_array = json_decode($json_text, TRUE); 
    switch (json_last_error()) { 
     case JSON_ERROR_NONE: 
      return array(
       "status" => 0, 
       "value" => $decoded_array 
      ); 


     case JSON_ERROR_DEPTH: 
      return array(
       "status" => 1, 
       "value" => 'Maximum stack depth exceeded' 
      ); 

     case JSON_ERROR_STATE_MISMATCH: 
      return array(
       "status" => 1, 
       "value" => 'Underflow or the modes mismatch' 
      ); 

     case JSON_ERROR_CTRL_CHAR: 
      return array(
       "status" => 1, 
       "value" => 'Unexpected control character found' 
      ); 

     case JSON_ERROR_SYNTAX: 
      return array(
       "status" => 1, 
       "value" => 'Syntax error, malformed JSON' 
      ); 

     case JSON_ERROR_UTF8: 
      return array(
       "status" => 1, 
       "value" => 'Malformed UTF-8 characters, possibly incorrectly encoded' 
      ); 

     default: 
      return array(
       "status" => 1, 
       "value" => 'Unknown error' 
      ); 
    } 
} 
1

這是怎樣把柄json

/** 
* Parse the JSON response body and return an array 
* 
* @return array|string|int|bool|float 
* @throws RuntimeException if the response body is not in JSON format 
*/ 
public function json() 
{ 
    $data = json_decode((string) $this->body, true); 
    if (JSON_ERROR_NONE !== json_last_error()) { 
     throw new RuntimeException('Unable to parse response body into JSON: ' . json_last_error()); 
    } 

    return $data === null ? array() : $data; 
}