2010-06-19 46 views
0

我試圖從json內容中提取特定值。這裏是鏈接的JSON代碼http://www.ebayclassifieds.com/m/AreaSearch?jsoncallback=json&lat=41.1131514&lng=-74.0437521正如你可能看到的代碼顯示爲php json decode - 獲取值

 
json({items:[{url:" http://fairfield.ebayclassifieds.com/ ",name:"Fairfield"},{url:" http://newyork.ebayclassifieds.com/ ",name:"New York City"}],error:null});
我需要提取的第一個url,在這種情況下是「 http://fairfield.ebayclassifieds.com/」,它的名稱值是「Fairfield」,我可以做到這一點正則表達式,但我寧願使用json_decode。不幸的是,當我嘗試解碼它不起作用

 
$json = getContent("http://www.ebayclassifieds.com/m/AreaSearch?jsoncallback=json&lat=41.1131514&lng=-74.0437521"); 
$test = json_decode($json, true); 
+2

問題是,這是無效的JSON。 「鑰匙」也必須在引號內(即'{「項目」:[{「url」:「http://fairfield.ebayclassifieds.com/」,名稱:「Fairfield」} ...'我玩了很少,但'json_decode'函數由於錯誤的引號而生成'JSON_ERROR_SYNTAX'錯誤。 – 2010-06-19 18:29:45

+0

剛剛意識到這一點,並更新了答案以反映它。 – dmp 2010-06-19 18:40:05

回答

0

它無效的JSON。鑰匙應該包裹在引號內。

您可以使用優秀的JSON Lint網站驗證您的json。

這是返回的數據的有效版本:

{ 
"items": [ 
    { 
     "url": "http://fairfield.ebayclassifieds.com/", 
     "name": "Fairfield" 
    }, 
    { 
     "url": "http://newyork.ebayclassifieds.com/", 
     "name": "New York City" 
    } 
], 
"error": "null" 
} 
+0

我試過$ test ='{items:[{url:「http://fairfield.ebayclassifieds.com/」,名稱:「Fairfield」},{url:「http://newyork.ebayclassifieds.com/」,名稱:「紐約市」}],錯誤:null}'; $ js = json_decode($ test,true); 回聲「js是$ js」; 並且不工作 – Michael 2010-06-19 18:20:25

+0

您是如何解釋「不工作」的?這是錯誤? – dmp 2010-06-19 18:27:26

+0

更新回答,無效,對不起:) – dmp 2010-06-19 18:37:15

2

正如danp已經說了,返回的JSON是封閉在一個函數調用(由jsoncallback=json指定)。你不能擺脫這種完全,但只是用AreaSearch?jsoncallback=&lat=41.1131514&lng=-74.0437521在字符串的開頭移除至少json,您可以通過擺脫括號:

$json = trim(trim($json), "();"); 

與得:

{items:[{url:"http://fairfield.ebayclassifieds.com/",name:"Fairfield"},{url:"http://newyork.ebayclassifieds.com/",name:"New York City"}],error:null} 

不幸的是,JSON字符串無效。密鑰(itemsurl,...)必須用引號"括起來。您可以很容易地檢查您是否遇到語法錯誤json_last_error()(錯誤代碼4JSON_ERROR_SYNTAX)。

更新:

根據這樣一個問題:Invalid JSON parsing using PHP,可以使JSON字符串適用於有:

$json = preg_replace('/(\w+):/i', '"\1":', $json); 

這個封閉在引號鍵。


如果字符串是有效的,那麼你可以生成通過數組:

​​

這將使您:

Array 
(
    [items] => Array 
     (
      [0] => Array 
       (
        [url] => http://fairfield.ebayclassifieds.com/ 
        [name] => Fairfield 
       ) 
      [1] => Array 
       (
        [url] => http://newyork.ebayclassifieds.com/ 
        [name] => New York City 
       ) 
     ) 
    [error] => 
) 

所以,你可以得到的第一個URL並通過$a['items'][0]['url']$a['items'][0]['name']分別命名。


但我再說一遍,你得到的響應JSON是無效並在其原來的形式,你不能json_decode()解析它。

+0

有沒有什麼辦法可以利用當前的「無效json」?基本上這就是我從ebayclassifieds得到它,所以我不能改變的方式顯示,因爲我沒有ebayclassifieds網站:) – Michael 2010-06-19 18:47:51

+1

@Michael:看到我更新的答案... – 2010-06-19 18:48:35

+0

現在我有$測試='({項目:[{url:「http://fairfield.ebayclassifieds.com/」,名稱:「Fairfield」},{url:「http://newyork.ebayclassifieds.com/」,名稱:「紐約市」}] ,錯誤:空});'; $ test = trim(trim($ test),「();」); $ test = preg_replace('/(\ w +):/ i','「\ 1」:',$ test); $ js = json_decode($ test,true); 回聲「js是$ js」; 但是不工作:( – Michael 2010-06-19 19:00:29