1

これは私のJSON配列です:

[
      [ 36,
        100,
        "The 3n + 1 problem",
         56717,
         0,
         1000000000,
         0,
         6316,
         0,
         0,
         88834,
         0,
         45930,
         0,
         46527,
         5209,
         200860,
         3597,
         149256,
         3000,
         1
      ],
      [
         ........
      ],
      [
         ........
      ],
         .....// and almost 5000 arrays like above
]

eah 配列の最初の 4 つの値が必要で、残りの値は次のようにスキップします。

36 100 "The 3n + 1 problem" 56717

そして、これは私がこれまでに書いたコードです:

reader.beginArray();
while (reader.hasNext()) {
    reader.beginArray();
    while (reader.hasNext()) {
         System.out.println(reader.nextInt() + " " + reader.nextInt()
                            + " " + reader.nextString() + " "
                            + reader.nextInt());
         for (int i = 0; i < 17; i++) {
            reader.skipValue();
         }
         reader.skipValue();
    }
    reader.endArray();
    System.out.println("loop is break"); // this is not printed as the inner loop is not breaking
}
reader.endArray();
reader.close();

そして、期待どおりに印刷されています:

36 100 "The 3n + 1 problem" 56717
.................................
..................................
1049 10108 The Mosquito Killer Mosquitos 49
1050 10109 Solving Systems of Linear Equations 129
1051 10110 Light, more light 9414
1052 10111 Find the Winning Move 365

これは機能していますが、内側のループが正しく壊れていません。私のコードの何が問題なのですか? 私のコードが機能しないように、私が見逃したものは何ですか?

編集:(解決策) 私はこの解決策になりました:

reader.beginArray();
            while (reader.hasNext()) {
                reader.beginArray(); 
                // read and parse first four elements, checking hasNext() each time for robustness
                int a = reader.nextInt(); 
                int b = reader.nextInt();
                String c = reader.nextString();
                int d = reader.nextInt();
                System.out.println(a + " " + b + " " + c + " " + d);
                while (reader.hasNext())
                    reader.skipValue();
                reader.endArray();
            } 
            reader.endArray();
4

1 に答える 1

2

hasNext() が false を返す場合は、skipValue() または next* を呼び出したくありません。GSONのドキュメントでは、最初に値を累積することを推奨しています。そのテーマのバリエーションは次のとおりです。

reader.beginArray();
while (reader.hasNext()) {
    int position;
    int a, b, d; // stores your parsed values
    String c; // stores your parsed values
    reader.beginArray(); 
    // read and parse first four elements, checking hasNext() each time for robustness
    for (position = 0; position < 4 && reader.hasNext(); ++ position) {
        if (position == 0) a = reader.nextInt(); 
        else if (position == 1) b = reader.nextInt();
        else if (position == 2) c = reader.nextString();
        else if (position == 3) d = reader.nextInt();
    } 
    // if position < 4 then there weren't enough values in array.
    if (position == 4) { // correctly read 
        System.out.println(a + " " + b + " " + c + " " + d);
    }
    // skip rest of array, regardless of number of values
    while (reader.hasNext())
        reader.skipValue();
    reader.endArray();
} 
reader.endArray();

これらの最初の 4 つの値を解析する方法は他にもたくさんあることに注意してください。状況に適した方法を使用してください (たとえば、最初にリストに格納するか、文字列として格納してから後で解析するか、または必要なものを何でも使用できます。要点は、配列内の要素の数を仮定せず、規則に従い、各要素を読み取る前に hasNext() を使用してください)。

于 2013-08-04T18:09:43.550 に答える