2012-06-07 69 views
0

我從geoPlugin http://www.geoplugin.net/json.gp?ip=64.90.182.55以下結果:PHP JSON解碼與反序列化

geoPlugin({ 
    "geoplugin_request":"64.90.182.55", 
    "geoplugin_status":200, 
    "geoplugin_city":"New York", 
    "geoplugin_region":"NY", 
    "geoplugin_areaCode":212, 
    "geoplugin_dmaCode":501, 
    "geoplugin_countryCode":"US", 
    "geoplugin_countryName":"United States", 
    "geoplugin_continentCode":"NA", 
    "geoplugin_latitude":40.70890045166, 
    "geoplugin_longitude":-74.001197814941, 
    "geoplugin_regionCode":"NY", 
    "geoplugin_regionName":"New York", 
    "geoplugin_currencyCode":"USD", 
    "geoplugin_currencySymbol":"$", 
    "geoplugin_currencyConverter":1 
}) 

有沒有辦法將它轉換成一個PHP數組?我不想使用geoPlugin的PHP API,因爲它似乎需要使用unserialize,它在我的開發服務器上生成E_WARNING(警告在生產中被禁止)。如果可以,我寧願不必處理E_WARNING。 json_decode不會在出錯時產生E_WARNING,但它不會將上述輸出視爲有效。

想法?

+2

您應該仔細瀏覽geoPlugin的網站:[webservices](http://www.geoplugin.com/webservices)。 – Gumbo

+0

Gumbo是正確的,您應該請求'http://www.geoplugin.net/php.gp?ip = 64.90.182.55',然後使用'unserialize'函數來解碼退貨。 – Lake

+0

你從'unserialize()'得到了什麼警告? – lanzz

回答

2

您可以嘗試刪除圍繞JSON的geoPlugin(),然後PHP的API應該可以工作。

您可以用str_replacesubstr將其刪除。

一個例子是:

$json = str_replace("geoPlugin(", "", $original_json); 
$json = substr($json, 0, -1); 
$data = json_decode($json); 
+0

好吧,我可以通過正則表達式來做到這一點。只是希望在PHP中會有一些本地功能,這將爲我做這個...... – StackOverflowNewbie

+2

^geoPlugin \((?。*)\)$ – StackOverflowNewbie

+0

很高興你能工作! – Daniel

0

正如你可以用jsonlint (demo)您提供的JSON字符串很容易地確認是無效的:

Parse error on line 1: 
geoPlugin({ "geo 
^ 
Expecting '{', '[' 

您若本報告您所使用的web服務,因爲它不是JSON,所以它看起來有誤導性,稱之爲JSON API。

另外它的誤導性在於你期望PHP json_decode函數可以使用非json字符串。

請參閱http://json.org瞭解關於json的更多信息。

但是,除了這些,你寫了你已經有了解決方案,你只是想知道。我希望這個答案實際上回答你的(隱藏的)問題,爲什麼這樣做不起作用。

下一次,你應該更直接地詢問你在找什麼;)希望這是有幫助的。

+1

API正在返回JSONP(以解決相同的原始策略)。 geoPlugin()部分是填充。我希望能將它轉換爲一個使用本地PHP函數的數組,因爲我不想處理'unserialize'函數。 – StackOverflowNewbie