У меня объект json выглядит так:

{
    Yg7R_: {
    fld_invoice: "Yg7R_"
    fld_order_id: "5"
        fld_orders: {
            4: {
                fld_oiid: "4"
                fld_date: "2014-03-27 00:00:00"
                fld_name: "20140327_H5epz2y4OB_IMG_20140326_020341.jpg"
                fld_loc: "../orders/oid_5/"
            }
        }
    }
    LldP_: {
    fld_invoice: "LldP_"
    fld_order_id: "7"
        fld_orders: {
            6: {
                fld_oiid: "6"
                fld_date: "2014-03-27 00:00:00"
                fld_name: "20140327_SovH7Xf3n2_IMG_20140326_020418.jpg"
                fld_loc: "../orders/oids_7/"
            }
        }
    }
    NYEO: {
        fld_invoice: "NYEO"
        fld_order_id: "24"
        fld_orders: {
            27: {
                fld_oiid: "27"
                fld_date: "2014-03-27 00:00:00"
                fld_name: "20140327_duLLsssVWA_IMG_20140326_020341.jpg"
                fld_loc: "orders/oid_24/"
            }
            28: {
                fld_oiid: "28"
                fld_date: "2014-03-27 00:00:00"
                fld_name: "20140327_F8ayA4vWrP_IMG_20140326_020405.jpg"
                fld_loc: "orders/oid_24/"
            }
            29: {
                fld_oiid: "29"
                fld_date: "2014-03-27 00:00:00"
                fld_name: "20140327_1FlYnuNbtr_IMG_20140326_020418.jpg"
                fld_loc: "orders/oid_24/"
            }
        }
    }
}

Я попытался разобрать, как это:

    // result is the above json object.
    for(int i = 0; i < result.length(); i++){
    try {
        invoice = result.getJSONArray(<Some name here>); // this name is dynamic
        Log.d("invoice "+i, invoice);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Но я не понимаю, как я могу получить доступ к динамическому имени. Как мы могли разобрать такой JSON

--Примечание-- Я. все значения имеют свои кавычки, например: "Yg & R_"

5
Robz 4 Апр 2014 в 10:39
 – 
Sree
4 Апр 2014 в 10:42
1
Я это видел.. Но jsonObject не похож на мой
 – 
Robz
4 Апр 2014 в 10:49
Ключ меняется динамически?
 – 
Sree
4 Апр 2014 в 10:52
Да, и может иметь больше значений
 – 
Robz
4 Апр 2014 в 10:59

3 ответа

Лучший ответ

Попробуйте этот динамический парсер json

private void parseJson(JSONObject data) {

        if (data != null) {
            Iterator<String> it = data.keys();
            while (it.hasNext()) {
                String key = it.next();
                try {
                    if (data.get(key) instanceof JSONArray) {
                        JSONArray arry = data.getJSONArray(key);
                        int size = arry.length();
                        for (int i = 0; i < size; i++) {
                            parseJson(arry.getJSONObject(i));
                        }
                    } else if (data.get(key) instanceof JSONObject) {
                        parseJson(data.getJSONObject(key));
                    } else {
                        System.out.println(key + ":" + data.getString(key));
                    }
                } catch (Throwable e) {
                    try {
                        System.out.println(key + ":" + data.getString(key));
                    } catch (Exception ee) {
                    }
                    e.printStackTrace();

                }
            }
        }
    }
13
Biraj Zalavadia 4 Апр 2014 в 10:49
2
Вы только что спасли день!
 – 
Rohit Mandiwal
31 Мар 2020 в 11:16

У вас нет массивов JSON. У вас есть только объекты JSON. Вместо этого вам нужно использовать getJSONObject. Массивы окружены [] и могут содержать несколько безымянных объектов, разделенных запятыми. Объекты окружены {} и имеют одно значение с одним именем.

1
Gabe Sechan 4 Апр 2014 в 10:42
Хорошо, тогда, если я использовал getJSONObject вместо этого, как я могу извлечь данные ??
 – 
Robz
4 Апр 2014 в 10:48

Сделать это можно одним трюком. Вам необходимо получить весь массив ключей и соответствующий массив значений JSONObject. Следуйте приведенному ниже коду.

JSONObject jsonObj = new JSONObject(JsonResponseString);

    JSONArray data1 = jsonObj.getJSONArray("Result");
    JSONObject obj2 = (JSONObject) data1.get(0);

    JSONArray nameArray = obj2.names();
    JSONArray valArray = obj2.toJSONArray(nameArray);

    String status="";
    String gameId="";

    for(int i=0 ; i<valArray.length() ; i++){
        String name = nameArray.getString(i);
        String value = valArray.getString(i);

        if (value.equals("null")) {
            value = "";
        }

        if (name.equalsIgnoreCase(Constants.Key_1)) {
            Log.v(Constants.LOG, + value);

        } else if (name.equalsIgnoreCase(Constants.Key_2)) {
            Log.v(Constants.LOG, + value);

        } else if (name.equalsIgnoreCase(Constants.Key_3)) {
            Log.v(Constants.LOG, + value);

        } 
    }
1
hharry_tech 4 Апр 2014 в 10:52