Исключение JsonReader в Android при анализе больших данных JSON

Я получаю исключение при использовании класса JsonReader в android при анализе больших json-данных.

Исключение:

 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)........ 

У меня есть заговор с коротким замыканием и проверка для чтения.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(); } } 

Удачи