gpt4 book ai didi

android - GSON:END_OBJECT 永远不会被调用

转载 作者:搜寻专家 更新时间:2023-11-01 08:46:27 25 4
gpt4 key购买 nike

我有一个像这样的 JSON:

{"aData":

{"tournaments":

{"new":[

{"token":"1-token", "prio":"6", "status":"inactive", ..., "_timeCreated":"2014-04-14 14:44:49", "_timeChanged":"2014-08-08 12:30:20"},

{"token":"2-token","prio":"8","status":"inactive",...}

]

JSON 文件大小为 8 MB 且有效,因为它可以使用默认的 new JSONObject(str) 或在 Volley 的 JsonObjectRequest 中进行解析。

我使用的代码:

 reader = new JsonReader( new InputStreamReader( am.open( "updatedata.json" ) ) );
reader.setLenient( true );
while( reader.hasNext() ){
eachToken( reader );
Log.i( TAG, "has next " + reader.hasNext() );
}

private boolean eachToken( JsonReader reader ) throws IOException {
JsonToken token = reader.peek();
switch( token ){
case BEGIN_ARRAY:
reader.beginArray();
Log.i( TAG, "array <<" );
break;
case END_ARRAY:
reader.endArray();
Log.i( TAG, "array >>" );
break;
case BEGIN_OBJECT:
reader.beginObject();
Log.i( TAG, "{" );
break;
case END_OBJECT:
reader.endObject();
Log.i( TAG, "}" );
break;
case NAME:
String name = reader.nextName();
Log.i( TAG, name );
break;
case STRING:
String s = reader.nextString();
Log.i( TAG, s );
break;
case NUMBER:
int n = reader.nextInt();
Log.i( TAG, "" + n );
break;
case BOOLEAN:
boolean b = reader.nextBoolean();
Log.i( TAG, "" + b );
break;
case NULL:
reader.nextNull();
Log.i( TAG, "null" );
break;
case END_DOCUMENT:
Log.i( TAG, "end doc" );
return false;
default:
Log.i( TAG, token.toString() );
}
return true;
}

问题是,永远不会遇到 END_OBJECT 的情况。它将以下内容打印到 logcat 中:

  01-06 13:30:32.817: I/DataService(1819): {
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): aData
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): {
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): tournaments
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): {
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): new
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): array <<
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.817: I/DataService(1819): {
01-06 13:30:32.817: I/DataService(1819): has next true
01-06 13:30:32.827: I/DataService(1819): token
01-06 13:30:32.827: I/DataService(1819): has next true
01-06 13:30:32.827: I/DataService(1819): 1-token
01-06 13:30:32.827: I/DataService(1819): has next true
01-06 13:30:32.827: I/DataService(1819): prio
01-06 13:30:32.827: I/DataService(1819): has next true
01-06 13:30:32.827: I/DataService(1819): 6
01-06 13:30:32.827: I/DataService(1819): has next true
01-06 13:30:32.827: I/DataService(1819): status
01-06 13:30:32.827: I/DataService(1819): has next true
01-06 13:30:32.827: I/DataService(1819): inactive
01-06 13:30:32.837: I/DataService(1819): has next true
01-06 13:30:32.837: I/DataService(1819): _timeCreated
01-06 13:30:32.837: I/DataService(1819): has next true
01-06 13:30:32.837: I/DataService(1819): 2014-04-14 14:44:49
01-06 13:30:32.837: I/DataService(1819): has next true
01-06 13:30:32.837: I/DataService(1819): _timeChanged
01-06 13:30:32.837: I/DataService(1819): has next true
01-06 13:30:32.837: I/DataService(1819): 2014-08-08 12:30:20
01-06 13:30:32.837: I/DataService(1819): has next false

因此,它到达第一个对象的 "_timeChanged":"2014-08-08 12:30:20",然后是 reader.hasNext()变为 false 而不是移动到新的 BEGIN_OBJECT 标记。

我错过了什么? TIA

最佳答案

hasNext() 表示“如果当前数组或对象有另一个元素,则返回 true。”在您的情况下,当它到达对象或数组的末尾时 hasNext()false 所以 case END_ARRAYcase END_OBJECT 不要被调用。

这可能有效:

while( reader.hasNext() 
|| reader.peek() == END_ARRAY
|| reader.peek() == END_OBJECT ){
eachToken( reader );
Log.i( TAG, "has next " + reader.hasNext() );
}

这与 Joey 的回答基本相同,但不适合发表评论。

关于android - GSON:END_OBJECT 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com