如何访问没有名称的对象内的JSON对象

时间:2017-12-05 15:54:50

标签: java android json parsing nullpointerexception

我有JSON

{
    "success": true,
    "shippingMethod": [
        {
            "flat": {
                "code": "flat.flat",
                "title": "Flat Shipping Rate",
                "cost": "5.00",
                "tax_class_id": "9",
                "text": "$5.00"
            }
        },
        {
            "zajil": {
                "code": "zajil.zajil",
                "title": "Zajil Shipping",
                "cost": "26",
                "tax_class_id": "0",
                "text": "$26.00"
            }
        }
    ]
}

注意 object中的每个真实array都在一个没有名称的不必要的对象中,即上面代码中的flatzajil是另一个对象。
我只需要那些嵌套对象flatzajil中的数据。当我尝试这段代码时

JSONArray shippingMethods = response.optJSONArray("shippingMethod");
          for (int i = 0; i < shippingMethods.length(); i++) {
          JSONObject shippingObj = shippingMethods.optJSONObject(i);
          JSONObject shippingMethod = shippingObj.optJSONObject("");
          Iterator<?> keys = shippingObj.keys();
             shippingMethod.optString("title");
             shippingMethod.optString("cost");
       }

我想我可以得到没有名字的Object

JSONObject shippingMethod = shippingObj.optJSONObject("");

但是当它从中获取内容时它不起作用并抛出NullPointerException。然后我尝试iterate keys喜欢

Iterator<?> keys = shippingObj.keys();

它没有显示任何内容,因为此对象不直接包含任何键。所以我的问题是如何从上面title获取所需的数据costJSON我无法更改JSON,因为它是客户网站的默认结构。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

试试这样,可以帮到你

//get response
JSONObject jsonObject = new JSONObject("response");

//get status
boolean success = jsonObject.getBoolean("success");

if(success){
    //get jsonarray from response
    JSONArray shippingMethodArray = jsonObject.getJSONArray("shippingMethod");

    //iterate array
    for(int i=0; i<shippingMethodArray.length(); i++){

        jsonObject = shippingMethodArray.getJSONObject(i);

        //get all keys from jsonObject
        List<String> allKeys = getAllKeys(jsonObject);

        //iterate all keys
        for(String key: allKeys) {

            //get jsonObject by key
            jsonObject = jsonObject.getJSONObject(key);

            //get data
            String title = jsonObject.getString("title");
            String cost = jsonObject.getString("cost");
        }
    }
}else {
    //do if not success...
}


//returns all keys from jsonobjects
private List<String> getAllKeys(JSONObject jsonObject) throws JSONException{
    List<String> keys = new ArrayList<String>();

    Iterator<?> iterator = jsonObject.keys();
    while( iterator.hasNext() ) {
        String key = (String)iterator.next();
        keys.add(key);
    }
    return keys;
}

答案 1 :(得分:0)

  

如何访问没有名称

的对象内的JSON对象

所有对象都在您的JSON中有名称。

  

我只需要将这些嵌套对象中的数据变为flat和zajil。

flatzajil是对象的名称。您碰巧不关心这些名称的事实并不意味着这些名称不存在。

如果您的JSON设置为每个对象只包含一个嵌套对象,请使用keys()names()查找名称,然后按该名称检索对象。您正尝试按""检索对象,flatzajil都不是""

  

它没有显示任何内容,因为此对象不直接包含任何键

是的,确实如此。密钥分别为flatzajil

i0时,shippingMethods.optJSONObject(i)将返回包含以下内容的JSONObject

    {
        "flat": {
            "code": "flat.flat",
            "title": "Flat Shipping Rate",
            "cost": "5.00",
            "tax_class_id": "9",
            "text": "$5.00"
        }
    }

keys()上拨打JSONObject将返回Iterator;如果从中获得第一个值,则该值将为flat