17

Json 配列を動的に解析したい。jsonarray の下の各要素の KEYS の配列を取得したい。私はイテレータを介してこれを取得しています。出力json形式に従ってシーケンスを取得していません。

私のJSON形式:

{
  "result": "Success",
  "AlertDetails": [
    {
      "ShipmentNumber": "SHP34",
      "Customer": "BEST",
      "DateCreated": "2012-08-29T04:59:18Z"
      "CustomerName": "BEST"
    },
    {
      "ShipmentNumber": "SHP22",
      "Customer": "BEST",
      "DateCreated": "2012-08-29T05:34:18Z"
      "CustomerName": "Jelly"
    }
  ]
}

ここに私のコードがあります:

    JSONArray array = jsonobject.getJSONArray("AlertDetails");

    JSONObject keyarray = array.getJSONObject(0);
    Iterator temp = keyarray.keys();
        while (temp.hasNext()) {
                    String curentkey = (String) temp.next();
                    KEYS.add(curentkey);

    }
Log.d("Parsing Json class", "  ---- KEYS---- " + KEYS);

logcate出力で得ているもの:

 ---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber]

私が欲しいもの:

 ---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName]
4

5 に答える 5

12

JSONObject ドキュメント (リンク: http://developer.android.com/reference/org/json/JSONObject.htmlkeys() ) には、関数に関する次の説明があります。

公開反復子キー ()

以来: API レベル 1

このオブジェクトの文字列名の反復子を返します。返された反復子は remove をサポートしており、このオブジェクトから対応するマッピングを削除します。イテレータが返された後にこのオブジェクトが変更された場合、イテレータの動作は未定義です。キーの順序は定義されていません

したがって、キーを取得することはできますが、順序は未定義です。キーを特定の順序で並べたい場合は、任意のソート アルゴリズムを使用できます。

編集

WS から取得している KEYS の順序を認識していないため、データを受信した後、順序付けられた形式で画面に詳細を表示できます。をビルドした後arraylist KEYS、次を使用してアルファベット順に並べ替えることができます。

Collections.sort(KEYS);  

これによりStrings自然な順序付け(アルファベット順KEYS arraylist)に従って が順序付けられます。

于 2012-08-31T13:18:39.760 に答える
6

ctlr+space barを押すと、キーの動作が未定義であり、順序がキーによって維持されないことが明確に書かれていることがわかりました

ここに画像の説明を入力

Arun Georgeは、目標を達成するには、任意の並べ替え方法を使用する必要があると正しく言いました。

並べ替えには、このリンクが役立つ場合があります。

于 2012-08-31T13:37:00.970 に答える
6

Googleの GSONライブラリを使用します。json 配列と json オブジェクトを読み取り/作成/解析するための多くの設定があります。解決策を見つけるためにテストはしませんでしたが、非常にシンプルでフル機能のツールであり、問​​題を解決できると思います。

于 2012-09-01T05:18:11.587 に答える
4

別のライブラリを使用して、json を動的に解析します。

以下に、私の意見では最高の JSON ライブラリである Jackson JSON Processor に基づいてコードを書きました。

public void test() throws IOException {
    String str = "{\n" +
            "  \"result\": \"Success\",\n" +
            "  \"AlertDetails\": [\n" +
            "    {\n" +
            "      \"ShipmentNumber\": \"SHP34\",\n" +
            "      \"Customer\": \"BEST\",\n" +
            "      \"DateCreated\": \"2012-08-29T04:59:18Z\",\n" +
            "      \"CustomerName\": \"BEST\"\n" +
            "    }\n" +
            "  ]\n" +
            "}";

    JsonFactory factory = new JsonFactory();
    JsonParser jsonParser = factory.createJsonParser(str);

    JsonToken jsonToken;
    SerializedString alertDetails = new SerializedString("AlertDetails");
    while (!jsonParser.nextFieldName(alertDetails)) { /* move to AlertDetails field */ }

    jsonParser.nextToken(); // skip [ start array
    jsonParser.nextToken(); // skip { start object
    // until } end object
    while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) {
        if (jsonToken == JsonToken.FIELD_NAME) {
            System.out.println(jsonParser.getCurrentName());
        }
    }

}

json と同じ順序でフィールド名を出力するだけです。

ShipmentNumber
Customer
DateCreated
CustomerName

編集

もちろん、gson などの他のライブラリを使用することもできます。ただし、json.orgに書かれているように、次のことを覚えておいてください。

オブジェクトは、名前と値のペアの順序付けられていないセットです。

キーの順序は実装によって異なり、リクエストごとに異なる場合があります。

于 2012-08-31T13:51:21.607 に答える
3

メソッドnames();もあります。

このオブジェクトの文字列名を含む配列を返します。

編集: 未定義の順序で名前を返します。提案: 自分で解析してください

于 2012-08-31T13:23:44.907 に答える