2015-07-01 71 views
4

我找不到解決方案。無法解碼PHP中的JSON值

我有一個API巫婆給我JSON resposne,

http://api.vajehyab.com/v2/public/?q=%D8%B3%D9%84%D8%A7%D9%85&developer=stackoverflow

這是這樣的,

{ 「搜索」:{ 「Q」:「\ u0633 \ u0644 \ u0627 \ u0645" , 「代碼」:200}, 「數據」:{ 「標題」: 「\ u0633 \ u0644 \ u0627 \ u0645」, 「發音」: 「」, 「文本」:「(\ u0633 \ u064e )[\ u0639。](\ u0645 \ u0635 \ u0644。)1 - \ u062f \ u0631 \ u0648 \ u062f \ u06af \ u0641 \ u062a \ u0646。2 - \ u0628 \ u06a \ u06af \ u0632 \ u0646 \ u062f \ u0634 \ u062f \ u0646。3 - \ u0631 \ u062f \ u0646 \ u0646 \ u0647 \ u0627 \ u062f \ u 0646。 \ u061b〜\ u0639 \ u0644 \ u06cc \ u06a9 \ u062f \ u0631 \ u0648 \ u062f \ u0628 \ u0631 \ u062a \ u0648 \ u0628 \ u0627 \ u062f。 \ u061b〜\ u0639 \ u0644 \ u06cc \ u06a9 \ u0645 \ u062f \ u0631 \ u0648 \ u062f \ u0628 \ u0631 \ u0634 \ u0645 \ u0627。 「,」source「:」\ u0641 \ u0631 \ u0647 \ u0646 \ u06af \ u0641 \ u0627 \ u0631 \ u0633 \ u06cc \ u0645 \ u0639 \ u06cc \ u0646 | ,「永久鏈接」:「?q =%D8%B3%D9%84%D8%A7%D9%85」},「error」:{「message 「:」」, 「原因」: 「」}, 「廣告」:{ 「文」: 「」, 「URL」: 「」}}

它似乎並未有問題,我可以它在其他工具,但PHP解碼,我不能在PHP

$json = file_get_contents('http://api.vajehyab.com/v2/public/?q='.urlencode('سلام').'&developer=stackoverflow'); 
var_dump(json_decode($json)); // null 

我希望有人能幫助我與此對其進行解碼, 謝謝...

+0

使用json_last_error()。並檢查錯誤代碼。 – Jagadeesh

+0

我做@Stanimir說,這是一個' - 語法錯誤,格式錯誤的JSON', –

+0

適用於我在PHP 5.5.21,也許PHP版本的問題。 – ChristianM

回答

3

從PHP文檔兩者http://php.net/manual/bg/function.json-last-error.php 運行此如果您收到任何錯誤,請告訴我們。

json_decode($string); 

switch(json_last_error()) 
{ 
    case JSON_ERROR_DEPTH: 
     echo ' - Maximum stack depth exceeded'; 
    break; 
    case JSON_ERROR_CTRL_CHAR: 
     echo ' - Unexpected control character found'; 
    break; 
    case JSON_ERROR_SYNTAX: 
     echo ' - Syntax error, malformed JSON'; 
    break; 
    case JSON_ERROR_NONE: 
     echo ' - No errors'; 
    break; 
} 
+0

嗨,它是' - 語法錯誤,格式錯誤的JSON',:| 現在我該怎麼做? : -/ –

+0

http://jsonlint.com/顯示沒有錯誤。我會做一些測試並回來 – Stanimir

2

EDIT2:在PHP 5.3+這似乎太工作:https://stackoverflow.com/a/24933162/2433843

EDIT3:

$json = file_get_contents('http://api.vajehyab.com/v2/public/?q='.urlencode('سلام').'&developer=stackoverflow'); 

$unescaped = json_encode(preg_replace_callback('/\\\\u(\w{4})/', function ($matches) { 
    return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8'); 
}, $json)); 
var_dump($unescaped); 

來自於json_encode

+0

不,'json_decode'仍然返回null!'jsonlint'驗證他們兩個,但PHP說它不是:| –

+0

對不起@EmadGhasemi,試試這個:\t '$轉義= json_encode(preg_replace_callback( '/ \\\\ U(\ w {4})/',函數($匹配){ \t回html_entity_decode(「&#X '。$ matches [1]。';',ENT_COMPAT,'UTF-8'); \t},$ json));' –

+1

什麼?你爲什麼重新編碼JSON? –

0

我認爲這個問題是從file_get_contents功能。當輸入是字符串時,json_decode正常工作。下面的代碼正確運行。

$json = '{"search":{"q":"\u0633\u0644\u0627\u0645","code":200},"data":{"title":"\u0633\u0644\u0627\u0645","pronunciation":"","text":"(\u0633\u064e) [ \u0639 . ] (\u0645\u0635 \u0644 .) 1 - \u062f\u0631\u0648\u062f \u06af\u0641\u062a\u0646 . 2 - \u0628\u06cc \u06af\u0632\u0646\u062f \u0634\u062f\u0646 . 3 - \u06af\u0631\u062f\u0646 \u0646\u0647\u0627\u062f\u0646 . \u061b ~ \u0639\u0644\u06cc\u06a9 \u062f\u0631\u0648\u062f \u0628\u0631 \u062a\u0648 \u0628\u0627\u062f. \u061b ~ \u0639\u0644\u06cc\u06a9\u0645 \u062f\u0631\u0648\u062f \u0628\u0631 \u0634\u0645\u0627. ","source":"\u0641\u0631\u0647\u0646\u06af \u0641\u0627\u0631\u0633\u06cc \u0645\u0639\u06cc\u0646 | \u0648\u0627\u0698\u0647 \u06cc\u0627\u0628","permalink":"?q=%D8%B3%D9%84%D8%A7%D9%85"},"error":{"message":"","reason":""},"ads":{"text":"","url":""}}'; 
var_dump(json_decode($json)); 
+0

我也試過CURL函數,但它不起作用。 –

0

請通過json_encode()PHP函數在編碼之前編碼數據爲utf8格式。我希望它有幫助。 [utf8_encode()]