2011-12-05 177 views
1

我已經在java中生成了一個包含JSON對象的HTMLPost請求,並且想要用PHP解析它。PHP中的JSON POST請求解析

public static String transferJSON(JSONObject j) { 
    HttpClient httpclient= new DefaultHttpClient(); 
    HttpResponse response; 
    HttpPost httppost= new HttpPost(SERVERURL); 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    nameValuePairs.add(new BasicNameValuePair("json", j.toString())); 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
    response = httpclient.execute(httppost); 
} 

而且服務器

<?php 

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 

    // input = "json=%7B%22locations%22%3A%5B%7B%22..." 
    $input = file_get_contents('php://input'); 

    // jsonObj is empty, not working 
    $jsonObj = json_decode($input, true); 

我想這是因爲JSON特殊字符進行編碼的。

json_decode返回空響應

任何想法爲什麼?

回答

4

相反過帳application/json實體的,實際上是張貼與單個值對JSON =(編碼JSON)的HTTP形式實體(application/x-www-form-urlencoded)。

代替

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
nameValuePairs.add(new BasicNameValuePair("json", j.toString())); 
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

嘗試

httppost.setEntity(new StringEntity(j.toString(),"application/json","UTF-8")); 
+2

感謝甚至比改變輸入更好的解決方案。您的構造函數與3個字符串不存在。我使用了'StringEntity stringEntity = new StringEntity(j.toString(),「UTF-8」); stringEntity.setContentType(「application/json」);' –

+0

肯定會與您使用的HTTP客戶端/ HTTP組件的版本有所不同。我只是從[最新的javadoc](http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/entity/StringEntity.html) – Charlie

+0

拉的構造函數好的應該是。我在Android上使用Java版本。 –

2

這是通過設計:您正在訪問原始POST數據,需要進行URL編碼。

對數據先使用urldecode()

+0

酷它的作品!謝謝 –

1

嘗試這種情況:

//remove json= 
$input = substr($input, 5); 

//decode the url encoding 
$input = urldecode($input); 

$jsonObj = json_decode($input, true);