2013-05-21 34 views
4

解析大型json數據時,在android中使用JsonReader類時出現異常。解析大型JSON數據時Android中的JsonReader異常

例外:

java.lang.IllegalStateException: Expected a name but was STRING 

JSON數據是有效的,但我不能找出這個異常的原因!

非常感謝!

我的代碼:

public void readJsonStream(InputStream in) throws IOException { 
     JsonReader reader = new JsonReader(new InputStreamReader(in)); 

     reader.setLenient(true); 
     try { 
      readJsonObject(reader); 
     } catch (Exception e) { 

      System.out.println(e); 
     } finally { 

      reader.close(); 
     } 

    } 


    // Read Json From JsonReader Class 

    public void readJsonObject(JsonReader reader) throws IOException { 

     reader.beginObject(); 
     while (reader.hasNext()) { 

      String name = reader.nextName(); 

      System.out.println(name.equals("result")); 
      if (name.equals("result")) { 
       reader.beginObject(); 

       while (reader.hasNext()) { 
        String josnParser = reader.nextName(); 

        if (josnParser.equals(optionmaster)) { // Optionmaster 
         reader.beginArray(); 

         while (reader.hasNext()) { 

          readJsonArray(reader); 
         } 
         reader.endArray(); 
        } else { 
         reader.skipValue(); 
        } 

       } 
       reader.endObject(); 

      } else { 
       reader.skipValue(); 
      } 
     } 
     reader.endObject(); 

    } 

    public void readJsonArray(JsonReader reader) throws IOException { 

     reader.beginObject(); 
     while (reader.hasNext()) { 

      String name = reader.nextName(); 
      System.out.println(name); // Here is My Exception .... 





    if (name.equals("om_id")&& reader.peek() != JsonToken.NULL) { 

      String om_id = reader.nextString(); 
    } 
     else if (name.equals("om_multiselect")&& reader.peek() != JsonToken.NULL) {  

      String om_multiselect = reader.nextString(); 
    } 
     else if (name.equals("omlang_name")&& reader.peek() != JsonToken.NULL) { 

      String omlang_name = reader.nextString(); 
    } 
     else if (name.equals("om_createdDate")&& reader.peek() != JsonToken.NULL) { 

      String om_createdDate = reader.nextString(); 
    } 
     else 
     { 
reader.skipValue(); 
} 


     } 

     reader.endObject(); 

    } 

而這裏的JSON數據:

{ 
     "result": { 
"options": [ 
       { 
        "opt_id": "8", 
        "opt_om_id": "3", 
        "optlang_name": "test1" 
       }, 
       { 
        "opt_id": "9", 
        "opt_om_id": "3", 
        "optlang_name": "test" 
       } 
      ], 
      "optionmaster": [ 
       { 
        "om_id": "2", 
        "om_multiselect": "N", 
        "omlang_name": "Style", 
        "om_createdDate": "2012-08-25 01:37:57" 
       }, 
       { 
        "om_id": "3", 
        "om_multiselect": "Y", 
        "omlang_name": "TEst", 
        "om_createdDate": "2012-08-25 01:37:57" 
       } 
      ] 

     } 
    } 

這裏是我的示例代碼,請審查,我解析選項陣成功,在我無法解析optionmaster錯誤這在嘗試解析「om_id」時出現

Logcat:

05-21 17:39:54.833: W/System.err(1116): java.lang.IllegalStateException: Expected a name but was STRING 

05-21 17:39:54.833: W/System.err(1116): at android.util.JsonReader.nextName(JsonReader.java:390) 
05-21 17:39:54.843: W/System.err(1116): at com.test.JsonParser.readJsonArray(JsonParser.java:174) 
05-21 17:39:54.843: W/System.err(1116): at com.test.JsonParser.readJsonObject(JsonParser.java:135) 
05-21 17:39:54.843: W/System.err(1116): at com.test.JsonParser.readJsonStream(JsonParser.java:49) 
05-21 17:39:54.843: W/System.err(1116): at com.test.ItemListActivity$ApiSyncController.doInBackground(ItemListActivity.java:149) 

05-21 17:39:54.853: W/System.err(1116): at com.test.ItemListActivity$ApiSyncController.doInBackground(ItemListActivity.java:1) 
05-21 17:39:54.853: W/System.err(1116): at android.os.AsyncTask$2.call(AsyncTask.java:287) 

05-21 17:39:54.853: W/System.err(1116): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 

05-21 17:39:54.863: W/System.err(1116): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 

05-21 17:39:54.863: W/System.err(1116): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 

05-21 17:39:54.863: W/System.err(1116): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
05-21 17:39:54.863: W/System.err(1116): at java.lang.Thread.run(Thread.java:856)........ 
+0

請張貼堆棧跟蹤和相關的代碼段。 – devconsole

+0

java.lang.IllegalStateException:預期名稱,但是STRING 05-21 18:48:57.502:W/System.err(3631):\t at android.util.JsonReader.nextName(JsonReader.java:390) 05 -21 18:48:57.502:W/System.err(3631):\t at com.tapendium.JsonParser.readJsonArray(JsonParser.java:299) 05-21 18:48:57.502:W/System.err(3631 ):\t at com.tapendium.JsonParser.readJsonObject(JsonParser.java:144) 05-21 18:48:57.512:W/System.err(3631):\t at – Nish

+0

這些是堆棧跟蹤日誌,我驗證了josn使用josnlint.com它是一個有效的例外,我明白,關鍵是null,但是當我調試我可以看到在讀者對象正確的json, – Nish

回答

0

我有一個短路的概念和reader.peek檢查不執行。 做reader.peek()首先檢查那麼你的IFS

if (reader.peek()!=JsonToken.NULL) { 
    if (name.equals("om_id")) { 
     String om_id = reader.nextString(); 
    } else if (name.equals("om_multiselect")) {  
     String om_multiselect = reader.nextString(); 
    } else if (name.equals("omlang_name")) { 
     String omlang_name = reader.nextString(); 
    } else if (name.equals("om_createdDate")) { 
     String om_createdDate = reader.nextString(); 
    } else { 
     reader.skipValue(); 
    } 
} 

好運走了過來