我有一个约30mb jsonFileInputStream.json的json文件。
[
["aaa", "kkk", "1674"],
["bbb", "jjj", "1673"],
["ccc", "qqq", "1677"],
..... // very long stream of data
["ddd", "zzz", "1677"]]
这是一个非常长的流,我无法存储为对象。 我见过以下问题,但它存储为对象,我不能这样做。
“Java: parse Array of Arrays from JSON”
while循环给出错误:
引起:java.lang.IllegalStateException:预期END_ARRAY但在第1行是BEGIN_ARRAY ....
我有以下代码,如果第一个字符串在任何数组中都不匹配,我会收到错误。
try {
JsonReader reader = new JsonReader(new InputStreamReader(jsonFileInputStream, "UTF-8"));
Gson gson = gsonBuilder.create();
reader.beginArray();
reader.beginArray();
while (reader.hasNext()) {
String abc = reader.nextString();
// check first string with input string
// it checks for matching string in json stream.
if (barCode.equals(abc) ) {
String name2 = reader.nextString();
String name3 = reader.nextString();
boolean found = true;
break;
} else {
reader.nextString();
reader.nextString();
reader.endArray();
reader.beginArray();
}
}
reader.endArray();
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我的错误堆栈跟踪如下所示:
java.lang.IllegalStateException: Expected END_ARRAY but was BEGIN_ARRAY at line 1 column 218 path $[1]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1075)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Caused by: java.lang.IllegalStateException: Expected END_ARRAY but was BEGIN_ARRAY at line 1 column 218 path $[1]
at com.google.gson.stream.JsonReader.endArray(JsonReader.java:368)
at com.android.features.home.TestActivity.readBarcodeFromMainDb(TestActivity)
答案 0 :(得分:0)
我认为当条件
时会出现问题barCode.equals(aaa)
永远不会满足。当你进入else分支时会发生以下情况:
["bbb", "jjj", "1673"],
["ccc", "qqq", "1677"],
你读得像:
...
reader.endArray();
reader.beginArray();
所以经过"]"你打电话给reader.endArray() 然后你就调用reader.beginArray() 因为你期待下一个阵列。
如果你进入文件末尾的else语句,你将在json文件的末尾结束:
["ddd", "zzz", "1677"]]
在第一次"]"之后你找到另一个"]"并且堆栈跟踪正好告诉你:
预计END_ARRAY但第1行是BEGIN_ARRAY
因此,您需要确保处理if语句中的条件永远不会为真的情况。
另外,你正在阅读
String abc = reader.nextString();
但是你没有在if语句中使用abc变量。我不确定这是你想要的。究竟是什么" barCode"变量在这里吗?
无论如何,要解决问题,只需更改代码如下:
...
Gson gson = gsonBuilder.create();
reader.beginArray();
while (reader.hasNext()) {
reader.beginArray(); //Moved this statement from outside the while to here
String abc = reader.nextString();
if (abc.equals(aaa) ) {
String name2 = reader.nextString();
String name3 = reader.nextString();
boolean found = true;
break;
} else {
reader.nextString();
reader.nextString();
reader.endArray();
//Remove the reader.beginArray() from here
}
}