Gson流API:无法读取JsonObject的所有迭代



我使用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();

这可能不能直接解决您的问题,但它使您更容易发现问题所在。例如,您当前的代码将在某些情况下不消耗值,因为不是所有的ifswitch语句都有elsedefault,所以在意外的JSON数据的情况下,您的代码将在不相关的地方调用JsonReader方法,导致难以追踪错误。

最新更新