2

次のような JSON があります。

{"aData":

{「トーナメント」:

{"新着":[

{"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",...}

] }

}

}

new JSONObject(str)JSON ファイルは 8 MB の大きさであり、デフォルトまたは .xml 内で解析できるため、有効ですVolley's 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()向きを変えます。falseBEGIN_OBJECT

私は何が欠けていますか?ティア

4

2 に答える 2

1

問題はデータの処理方法にあると思います

JavaDocを見ると、JsonReader配列ブラケットを使用する必要があることが特に定義されています..

配列処理メソッド内で、最初に beginArray() を呼び出して、配列の開き括弧を消費します。次に、値を累積する while ループを作成し、hasNext() が false のときに終了します。最後に、endArray() を呼び出して、配列の閉じ括弧を読み取ります。

配列が終了した後はそうhasNext()です...

于 2015-01-06T15:32:13.533 に答える