我使用GSON流api来解析JSON中的一个巨大数据响应,其中JSON就像在数组对象中,我们有所有对象的列表,每个对象都有一些属性。现在的问题是,当我试图通过我的代码解析这个响应时,它对于第一个对象集工作得很好,并且完美地遍历其中的每个属性,但是当它移动到第二个对象时,它在第一行失败,抛出以下错误。
期望的名称,但在行//行号是BEGIN_OBJECT,指向JSON中第二个对象的BeginObject
这是我用来解析的JSON结构:
{
"Report_Entry": [
{
"key1": "value",
"key2": "value",
"key3": "value",
"key4": "value",
"key5": "value"
},
{
"key1": "value",
"key2": "value",
"key3": "value",
"key4": "value",
"key5": "value"
}
]}
这是我用来解析的代码,我们如何才能实现所需的输出?
try {
HCMCycleTimePerBp hcmCycleTimePerBp = new HCMCycleTimePerBp();
poJSONReaderObj.beginObject();
while (poJSONReaderObj.hasNext()) {
String name = poJSONReaderObj.nextName();
if (name.equals("Report_Entry")) {
poJSONReaderObj.beginArray();
while (poJSONReaderObj.hasNext()) {
JsonToken nextToken2 = poJSONReaderObj.peek();
if (JsonToken.BEGIN_OBJECT.equals(nextToken2)) {
poJSONReaderObj.beginObject();
} else if (JsonToken.END_OBJECT.equals(nextToken2)) {
poJSONReaderObj.endObject();
} else {
String nextString = "";
if (JsonToken.STRING.equals(nextToken2)) {
nextString = poJSONReaderObj.nextString();
} else if (JsonToken.NAME.equals(nextToken2)) {
nextString = poJSONReaderObj.nextName();
}
switch (nextString) {
case "key1":
hcmCycleTimePerBp.setKey1(poJSONReaderObj.nextString());
break;
case "key2":
hcmCycleTimePerBp.setKey2(poJSONReaderObj.nextString());
break;
case "key3":
hcmCycleTimePerBp.setKey3(poJSONReaderObj.nextString());
break;
case "key4":
hcmCycleTimePerBp.setKey4(poJSONReaderObj.nextString());
break;
case "key5":
hcmCycleTimePerBp.setKey5(poJSONReaderObj.nextString());
break;
}
}
poJSONReaderObj.endObject();
System.out.println(
"Value of Map is : " + new Gson().toJson(hcmCycleTimePerBp) + "counter : " + counter);
counter++;
System.out.println("Counter : " + counter);
}
}
JsonToken nextToken = poJSONReaderObj.peek();
if (JsonToken.END_OBJECT.equals(nextToken)) {
poJSONReaderObj.endObject();
} else if (JsonToken.END_ARRAY.equals(nextToken)) {
poJSONReaderObj.endArray();
}
} catch (
IOException ioException) {
ioException.printStackTrace();
}
如果你确切地知道JSON结构,那么你可以摆脱peek()
和JsonToken....equals(...)
调用,而是使用:
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
String value = reader.nextString();
...
}
reader.endObject();
}
reader.endArray();
这可能不能直接解决您的问题,但它使您更容易发现问题所在。例如,您当前的代码将在某些情况下不消耗值,因为不是所有的if
和switch
语句都有else
或default
,所以在意外的JSON数据的情况下,您的代码将在不相关的地方调用JsonReader
方法,导致难以追踪错误。