java - JsonReader Exception in Android while parsing large JSON data -
i getting exception when using jsonreader
class in android while parsing large json data.
exception:
java.lang.illegalstateexception: expected name string
the json data valid can't find out reason exception!
thanks lot!
my code :
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); } { reader.close(); } } // read json 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 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(); }
and here's json data:
{ "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" } ] } }
here sample code please review , parsed options array successfully, couldn't parse optionmaster error appears when trying parse "om_id"
logcat:
05-21 17:39:54.833: w/system.err(1116): java.lang.illegalstateexception: expected name string 05-21 17:39:54.833: w/system.err(1116): @ android.util.jsonreader.nextname(jsonreader.java:390) 05-21 17:39:54.843: w/system.err(1116): @ com.test.jsonparser.readjsonarray(jsonparser.java:174) 05-21 17:39:54.843: w/system.err(1116): @ com.test.jsonparser.readjsonobject(jsonparser.java:135) 05-21 17:39:54.843: w/system.err(1116): @ com.test.jsonparser.readjsonstream(jsonparser.java:49) 05-21 17:39:54.843: w/system.err(1116): @ com.test.itemlistactivity$apisynccontroller.doinbackground(itemlistactivity.java:149) 05-21 17:39:54.853: w/system.err(1116): @ com.test.itemlistactivity$apisynccontroller.doinbackground(itemlistactivity.java:1) 05-21 17:39:54.853: w/system.err(1116): @ android.os.asynctask$2.call(asynctask.java:287) 05-21 17:39:54.853: w/system.err(1116): @ java.util.concurrent.futuretask.run(futuretask.java:234) 05-21 17:39:54.863: w/system.err(1116): @ android.os.asynctask$serialexecutor$1.run(asynctask.java:230) 05-21 17:39:54.863: w/system.err(1116): @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1080) 05-21 17:39:54.863: w/system.err(1116): @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:573) 05-21 17:39:54.863: w/system.err(1116): @ java.lang.thread.run(thread.java:856)........
i have concearn short circuit , check reader.peek not executing. reader.peek() check first go on 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(); } }
good luck
Comments
Post a Comment