2013-05-12 128 views
0

我遇到了JSON請求的問題。我試圖閱讀一個API並用這個代碼解析它(下面)。我已經有異步工作(到目前爲止),一旦我得到這個我應該設置。我得到的錯誤是在日誌中。JSONArray無法轉換爲給定字符串的JSONObject

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.util.Log; 


public class jsonParser { 

    //initialize 
    static InputStream stream = null; 
    static String result = " "; 
    static JSONObject object =null; 

    public jsonParser(){ 

    } 

    public JSONObject getJSONfromURL (String url){ 
     //HTTP call 
     try{ 
      URLConnection connection = new URL(url).openConnection(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()), 2048 * 16); 
      StringBuffer builder = new StringBuffer(); 
      String line; 

      while ((line = reader.readLine()) != null) { 
       builder.append(line).append("\n"); 
      } 
      String blah = builder.toString(); 
      JSONObject jsonObj = new JSONObject(new String(blah)); 
      JSONArray data = jsonObj.getJSONArray("Categories"); 

      for(int i=0; i < data.length(); i++) 
      { 
       object = data.getJSONObject(i); 
       String id = object.getString("id"); 
       String value = object.getString("name"); 
       Log.d("Item name: ", value); 
      } 




      } catch(Exception e){ 
       Log.e("Http Error","Error in http connection " + e.toString()); 

      } 


     return object; 
    } 
} 

下面

05-12 02:49:44.553: E/Http Error(19288): Error in http connection org.json.JSONException: Value ["Categories",[[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]]] of type org.json.JSONArray cannot be converted to JSONObject 
05-12 02:49:44.553: W/dalvikvm(19288): threadid=1: thread exiting with uncaught exception (group=0x40fb6438) 
05-12 02:49:44.563: E/AndroidRuntime(19288): FATAL EXCEPTION: main 
05-12 02:49:44.563: E/AndroidRuntime(19288): java.lang.NullPointerException 
05-12 02:49:44.563: E/AndroidRuntime(19288): at com.example.hstnc_activity.DisplayServiceActivity$Request.onPostExecute(DisplayServiceActivity.java:116) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at com.example.hstnc_activity.DisplayServiceActivity$Request.onPostExecute(DisplayServiceActivity.java:1) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at android.os.AsyncTask.finish(AsyncTask.java:631) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at android.os.Looper.loop(Looper.java:137) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at android.app.ActivityThread.main(ActivityThread.java:4918) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at java.lang.reflect.Method.invokeNative(Native Method) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at java.lang.reflect.Method.invoke(Method.java:511) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
05-12 02:49:44.563: E/AndroidRuntime(19288): at dalvik.system.NativeStart.main(Native Method) 

此錯誤日誌是我應該回去了,並通過服務器處理

["Categories",[[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]]] 
+0

什麼是'DisplayServiceActivity'的116線? – codeMagic 2013-05-12 06:57:15

+0

directory = json.getJSONArray(TAG_DIRECTORY); 也高於40行 private static String TAG_DIRECTORY =「Categories」; – user1890328 2013-05-12 06:58:48

+0

'json'爲'null'。我們之前有過這個舞嗎? – codeMagic 2013-05-12 06:59:41

回答

2

http://www.json.org/javadoc/org/json/JSONArray.html

嘗試

JSONArray jsonArray = new JSONArray(new String(blah)); 

相反

JSONObject jsonObj = new JSONObject(new String(blah)); 

在你的問題的JSON例子實際上是一個JSON陣列。

所以,作爲一個結果,這將是

... 
    public JSONObject getJSONfromURL (String url){ 
     //HTTP call 
     try{ 
      URLConnection connection = new URL(url).openConnection(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()), 2048 * 16); 
      StringBuffer builder = new StringBuffer(); 
      String line; 

      while ((line = reader.readLine()) != null) { 
       builder.append(line).append("\n"); 
      } 
      String blah = builder.toString(); 

      //Parsing string into JSONArray 
      JSONArray data = new JSONArray(new String(blah)); 


      for(int i=0; i < data.length(); i++) 
      { 
       object = data.getJSONObject(i); 
       String id = object.getString("id"); 
       String value = object.getString("name"); 
       Log.d("Item name: ", value); 
      } 




      } catch(Exception e){ 
       Log.e("Http Error","Error in http connection " + e.toString()); 

      } 


     return object; 
    } 


.. 

這裏是正在發生的事情與你的JSON數據的一些交代。 目前,它看起來像:

["Categories",[[{"id":"2","name":"Glass Repair"} .... 

JSONObject jsonObj = new JSONObject(new String(blah)); 
JSONArray data = jsonObj.getJSONArray("Categories"); 

是行不通的,因爲有這種所謂的「類別」 JSON數據裏面沒有對象,而是具有價值「分類」的字符串元素。

你應該確實是改革的JSON表示成

{"Categories":[{"id":"2","name":"Glass Repair"} .... } 

所以解析器可以計算出所謂的「類別」的JSON對象。

下面是關於編寫JSON語法的閱讀建議。

http://en.wikipedia.org/wiki/JSON 

此外,這裏是一個JSON驗證工具,迅速調試/正確的JSON語法

http://jsonlint.com/ 
+0

我更新了我的代碼到您的建議,現在在logcat中收到以下內容: '05-12 03:09:22.185:E/Http錯誤(21193):http連接中的錯誤org.json.JSONException:類型java.lang.String不能轉換成JSONObject' – user1890328 2013-05-12 07:10:36

+0

非常感謝你。我會在早上更新代碼,並讓每個人都知道它是如何發生的。 – user1890328 2013-05-12 07:27:02

+0

只要有人發現這一點,一旦JSON數據格式正確,它似乎完美的工作,這裏是新的輸出 '{「Categories」:[{「id」:「2」,「name」:「Glass Repair 「},{」id「:」3「,」name「:」家電維修「},{」id「:」4「,」name「:」空調「},{」id「:」5「, 「name」:「社區參與」},{「id」:「6」,「name」:「Electrical」},{「id」:「7」,「name」:「Flooring」},{「 :「8」,「名稱」:「加熱修復」},{「id」:「9」,「name」:「園林綠化」},{「id」:「10」,「name」:「Plumbing」} ,{「id」:「11」,「name」:「Remodeling \/Renovation」},{「id」:「12」,「name」:「Window Coverings」}]}' – user1890328 2013-05-12 16:52:29

0

您必須體貼兩兩件事:

  1. JSON響應對應JSONArrayJSONObject
  2. 根據回覆的格式,您的json響應中的"Categories"條目不是JSONArray

你應該試試這個。

JSONObject rawJson = new JSONObject (jsonResponse); 
JSONArray categories = rawJson.getJSONArray("Categories"); 

與此JSON格式

{"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
相關問題