2016-01-18 93 views
1

Android-Android- JSON解析通過異常

我得到以下JSON響應。當我點擊特定ID時,我有按鈕(1,1015,1016見下文)。它會返回內部的Json對象。

我只得到那個特定的ID(JSON)

[ 
     { 
      "1": 
      [ 
       { 
        "a": "a", 
        "b": 1, 
        "c": "1", 
        "d": "1-1-1-1" 
       }, 
       { 
        "a": "a", 
        "b": 6, 
        "c": "2", 
        "d": "1-1-1", 
        "e": "Meals" 
       } 
      ] 
     }, 
     { 
      "1015": 
      [ 
      ] 
     }, 
     { 
      "1016": 
      [ 
       { 
        "a": "a", 
        "b": 6, 
        "c": "2", 
        "d": "1-1-1", 
        "e": "Meals1234" 
       } 
      ] 
     }, 
     { 
      "1012": 
      [ 
       { 
        "a": "venky", 
        "b": 6, 
        "c": "2", 
        "d": "1-1-1", 
        "e": "Meals" 
       }, 
       { 
        "a": "venky2", 
        "b": 45, 
        "c": "2", 
        "d": "1-1-1", 
        "e": "Meals" 
       } 
      ] 
     }, 
     { 
      "1011": 
      [ 
       { 
        "a": "a", 
        "b": 6, 
        "c": "2", 
        "d": "1-1-1", 
        "e": "Meals567" 
       }, 
       { 
        "a": "a", 
        "b": 6, 
        "c": "2", 
        "d": "1-1-1", 
        "e": "Meals08676" 
       } 
      ] 
     } 
    ] 

我寫的Java代碼JSON解析如下

public void load_whole_JsonData() { 
     String number = ET_number.getText().toString().trim(); // edittext number is 1 (for example) 
     JSONArray jsonArray1; 
     JSONObject obj1; 
     JSONArray jsonArray2; 
     try { 
      jsonArray1=new JSONArray(JsonResponse); // parse the Json response here 
      obj1=new JSONObject(); 
      for (int i = 0; i < jsonArray1.length(); i++) { 
       try { 
        jsonArray2= jsonArray1.getJSONObject(i).getJSONArray(number); //number is IDs : 1 , 1015,1016 
        Log.v("test", "i"+i+ " obj1 "+jsonArray2); 
       } 
       catch (Exception e){ 
        Log.v("test", "exception "+e); 
       } 
      } 

     } catch (JSONException e) { 
      Log.v("MTV", "JsonParser exception" + e); 
      e.printStackTrace(); 
     } 
    } 

我得到正確的輸出,但趕上拋出,因爲有問題的

jsonArray2 = jsonArray1.getJSONObject(i).getJSONArray(number); //number is IDs : 1 , 1015,1016 

輸出(在logcat的):

V/test: i0 obj1 [{"a":"a","b":1,"c":"1","d":"1-1-1-1","e":"Meals"},{"a":"a","b":6,"c":"2","d":"1-1-1","e":"Meals"}] //This is the output 

V/test: exception org.json.JSONException: No value for 1 //catch exceptions 
V/test: exception org.json.JSONException: No value for 1 
V/test: exception org.json.JSONException: No value for 1 
V/test: exception org.json.JSONException: No value for 1 

如果有人有想法得到沒有catch異常的輸出。那麼如何獲得內部細節,如[{"a":"a","b":1,"c":"1","d":"1-1-1-1","e":"Meals"},{"a":"a","b":6,"c":"2","d":"1-1-1","e":"Meals"}]

編輯:

如果我給的數目是1016它將解析只有1016的內部細節[{「一」:「一個」,」 b「:1,」c「:」1「,」d「:」1-1-1-1「,」e「:」Meals「}(從整個JSON響應中獲得)

+2

你有兩個變量'number'具有相同類型'String'。你確定你的代碼正在編譯? – Rohit5k2

+0

您的問題中的第一個正確的代碼。一旦你寫了'jsonArray2 = jsonArray1.getJSONObject(i).getJSONArray(number);'和在你寫的另一個地方大致相同的東西'obj2 = jsonArray1.getJSONObject(i).getJSONArray(number);'。如果您在發佈之前編輯您的代碼,請正確使用它。 – Rohit5k2

+0

我剛剛給出了考慮的數字(字符串數字= 1)。現在我刪除了@ Rohit5k2 –

回答

1

你的代碼不工作,因爲在每個JSONObject你試圖找到一個數組鍵1,這是不可用。因此,在每個JSONObject中,您需要使用與陣列關聯的正確鍵。

做這個

try { 
     jsonArray1=new JSONArray(JsonResponse); // parse the Json response here 
     obj1=new JSONObject(); 
     for (int i = 0; i < jsonArray1.length(); i++) { 
      try { 
        JSONObject innerJson = jsonArray1.getJSONObject(i); 
        for(Iterator<String> iter = innerJson.keys();iter.hasNext();) 
        { 
         String key = iter.next(); 
         jsonArray2 = innerJson.getJSONArray(key); 
        } 
       Log.v("test", "i"+i+ " obj1 "+jsonArray2); 
      } 
      catch (Exception e){ 
       Log.v("test", "exception "+e); 
      } 
     } 

    } catch (JSONException e) { 
     Log.v("MTV", "JsonParser exception" + e); 
     e.printStackTrace(); 
    } 

更新

try { 
     jsonArray1=new JSONArray(JsonResponse); // parse the Json response here 
     obj1=new JSONObject(); 
     for (int i = 0; i < jsonArray1.length(); i++) { 
      try { 
        JSONObject innerJson = jsonArray1.getJSONObject(i); 
        for(Iterator<String> iter = innerJson.keys();iter.hasNext();) 
        { 
         String key = iter.next(); 
         if(!key.equalIgnoreCase(myKey)) // myKey is the key you want to parse such as 1016 
          continue; 
         jsonArray2 = innerJson.getJSONArray(key); 
        } 
       Log.v("test", "i"+i+ " obj1 "+jsonArray2); 
      } 
      catch (Exception e){ 
       Log.v("test", "exception "+e); 
      } 
     } 

    } catch (JSONException e) { 
     Log.v("MTV", "JsonParser exception" + e); 
     e.printStackTrace(); 
    } 
+0

Keyset()是什麼? –

+0

獲取錯誤「無法解析方法keySet()」。 –

+0

請立即嘗試。 'keySet'方法是隱藏的。 – Rohit5k2

0

只有第一數組中的對象有一個屬性"1"。對於在for循環中遇到的所有其他對象,將拋出異常。

在訪問它之前,您可能需要檢查JSON對象中是否存在屬性number

+0

是的,我知道。我只是給出的數字是爲了理解。數字是動態的。所以只有我問這個問題。 –

+0

你可以在你的問題中解釋你想達到的目標嗎? – Henry

+0

謝謝,如果我給的數字是1016.它將只解析1016的內部細節[{「a」:「a」,「b」:1,「c」:「1」,「d」:「1 -1-1-1「,」e「:」Meals「}(參考整個JSON響應)@henry –

1

因爲JSONObject包含動態名稱作爲密鑰JSONArray。所以JSONObject. keySet讓所有的鍵名,然後用它來獲得JSONArray爲:

JSONObject jsonObject = jsonArray1.getJSONObject(i); 
Iterator<String> iter = jsonObject.keys(); 
while (iter.hasNext()) { 
    String key = iter.next(); 
    try { 
     JSONArray jsonArray=jsonObject.getJSONArray(key); 
    } catch (JSONException e) { 
     // Something went wrong! 
    } 
} 
+0

什麼是Keyset()? –

+0

獲取錯誤「無法解析方法keySet()」。 –

+0

我在哪裏傳遞號碼值? (1或1016等) –

0

你得到異常,因爲你總是訪問與名稱陣列 「1」 的錯誤是在這行代碼

jsonArray2= jsonArray1.getJSONObject(i).getJSONArray(number) 

轉讓2015,2016等也

+0

請參閱我的問題,我已經告訴「該行給出例外」。 –

+0

如果我給出的數字是1016,它將只解析1016的內部細節[{「a」:「a」,「b」:1,「c」:「1」,「d」:「1-1 -1-1「,」e「:」Meals「}(參考整個JSON響應) –