2015-09-03 179 views
-2

我想從我的prestashop Web服務中獲得一些json對象或兒子數組。我可以使用AppKey通過url在瀏覽器中獲取我的json。但是這個請求在android request.my子對象中不起作用,因爲http請求無法接收它。 我的問題是如何在Android中通過請求獲取這個兒子,瀏覽器可以成功獲取它。從Web服務url獲取json數組

這是瀏覽器的json響應:

{"products":[{"id":107},{"id":120},{"id":767},{"id":26},{"id":27}]} 

,但我不能在Android中得到這個JSON,或者也許我的要求是錯誤的:

public class Asyncs { 
JSONParser jParser = new JSONParser(); 
JSONArray jsonArrays = new JSONArray(); 

public class GetProduct extends AsyncTask<String, String, ArrayList<String>> { 

    ArrayList<String> test = new ArrayList<>(); 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
    protected ArrayList<String> doInBackground(
      String... args) { 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     JSONObject json = jParser.makeHttpRequest("http://[email protected]/api/products", "GET", params); 
     Log.d(" Products: >>>>>>>>>> ", json.toString()); 
     try { 
      for (int i = 0; i < jsonArrays.length(); i++) { 
       JSONObject c = jsonArrays.getJSONObject(i); 
      } 

     } catch (JSONException e) { 
       e.printStackTrace(); 
     } 
     return test; 
    } 
    @Override 
    protected void onPostExecute(final ArrayList<String> result) { 

    } 
} 
} 

我的日誌:

2540-2553/? E/JSON Parser﹕ Error parsing data org.json.JSONException: End of input at character 0 of 
09-03 12:43:20.444 2540-2553/? W/dalvikvm﹕ threadid=10: thread exiting with uncaught exception (group=0xa6270288) 
09-03 12:43:20.444 2540-2553/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 
Caused by: java.lang.NullPointerException 
     at Requests.Asyncs$GetProduct.doInBackground(Asyncs.java:61) 
     at Requests.Asyncs$GetProduct.doInBackground(Asyncs.java:31) 
     at android.os.AsyncTask$2.call(AsyncTask.java:287) 
+0

可能重複[什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-isa-a- – njzk2

+0

不是一個真正的答案或者什麼,但你也許可以嘗試改裝庫來獲取服務器的JSON –

回答

1

你永遠不會得到一個JSON數組,你的「JSON」應該是一個數組。那些你得到你的JSON響應(「產品」是JSON數組),你必須做這樣的事情:

JSONObject json = jParser.makeHttpRequest("http://[email protected]/api/products", "GET", params); 

    JSONArray json_products = json.getJSONArray("products"); 

    for(int i = 0; i < json_products.length(); i++ { 

     JSONObject c = json_products.getJSONObject(i); 

     Log.e("Object ID:", c.getString("id"); 
    } 

另外,你檢查的實際JSON?你是否得到了完全的迴應? doInBackground上的空指針是因爲你調用的jsonArray完全爲null。

+0

我的問題是通過請求獲取兒子 –

+0

你嘗試使用http://loopj.com/android-async-http/?在一個簡單的步驟中,所有的GET,POST,PUT,DELETE請求都是非常好的異步。 –

+0

我用它,非常好。但它運行在失敗方法上。因爲它不能正確執行http請求。我的請求錯誤響應是:B @ 53790420 –

0
JSONObject json = jParser.makeHttpRequest("http://[email protected]/api/products", "GET", params); 

JSONArray array = json.get("products"); 

for(int i = 0; i < jsonArray.length(); i++ { 
    JSONObject c = jsonArrays.getJSONObject(i); 
} 
+0

不!它不工作!它需要用戶名了。在瀏覽器中,這個鏈接需要用戶通過!我的答案成功。 –

+0

馬塞爾托夫然後。 – FWeigl

0

我解決了我的問題。它是http客戶端授權:

client.setBasicAuth("MyApp-Key", ""); 
     client.get("http://elsevan.com/api/products/107", new JsonHttpResponseHandler(){ 

      @Override 
      public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
       super.onSuccess(statusCode, headers, response); 
       Toast.makeText(getActivity(), "Success!", Toast.LENGTH_LONG).show(); 


       Log.d("android OK", response.toString()); 
      } 
} 
}