在Android中解析动态JSON

5

我有一个 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_"


https://dev59.com/nWLVa4cB1Zd3GeqP1fz6#10267919 - Sree
1
@Sreekanthss 我看到了... 但是 jsonObject 和我的不一样。 - Robz
你的密钥是否动态变化? - Sree
是的,它可以有更多的值。 - Robz
3个回答

13

尝试使用这个动态的 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();

                }
            }
        }
    }

2
你刚刚拯救了这一天! - Rohit Mandiwal

1

您在这里没有任何JSON数组。您只有JSON对象。您需要使用getJSONObject代替。数组用[]括起来,可以有多个未命名的对象,用逗号分隔。对象用{}括起来,具有单个值和单个名称。


好的,那么如果我使用 getJSONObject,我该如何提取数据呢? - Robz

1
你可以通过一个技巧来实现这个。你需要获取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);

        } 
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接