2016-04-21 153 views
0

我試圖從php生成的文件與json數據獲取文件內容。Json_decode,file_get_contents var_dump返回NULL

Json已經被jsonlint.com網站檢查過。這是有效的。

$result = file_get_contents("url"); 
var_dump(json_decode($result,true)); 

Nginx不顯示任何錯誤。

爲什麼它不起作用? Json發生器在外部服務器上。 當我將它粘貼到http://php.fnlist.com/php/json_decode網站上時,它已正確轉換。

+2

'var_dump''$ result'變量。也許你甚至沒有從網址獲取內容。 – rinukkusu

+1

'「url」'它是真實的還是你傳遞一個有效的文件路徑? –

+0

url不是真實的url它僅僅作爲一個例子被粘貼 – Wojtokuba

回答

0

即使這是老問題了,可能是這樣的回答可以幫助別人當看到同樣的問題。

爲了解決這個問題,請確保:

  1. allow_url_fopen爲ON,檢查php.ini文件。
  2. url是一個有效的網址。要跳過一些關於傳遞變量的問題,您可以使用http_build_query
  3. 返回的json有效。您可以檢查退貨是否有效jsonlint.com
  4. stream_context已經設置,所以file_get_contents知道如何處理請求。 儘管我們通過HTTPS提供數據,但我們需要使用http context。我們設置methodPUTContent-typeapplication/jsonAcceptapplication/jsonConnectionclose,並Content-length我們的JSON字符串的長度。我們通過HTTP1.1發送這些數據,因此我們將其設置爲1.1。我們在請求的正文中發送了JSON,因此我們在內容中進行了設置。而當我們使用HTTPS時,我們需要配置ssl設置。

    $context = stream_context_create([ 'http' => [ 'method' => 'PUT', 'header' => "Content-type: application/json\r\n" . "Accept: application/json\r\n" . "Connection: close\r\n" . "Content-length: " . strlen($json_data) . "\r\n", 'protocol_version' => 1.1, 'content' => $json_data ], 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false ] ]);

最後把數據通過調用file_get_contents這樣的:

$getData = file_get_contents($url, false, $context); 
$results = json_decode($getData, TRUE); 

Hopely有用的,謝謝。