【问题标题】:Iterate through a JSONArray in a JSONObject遍历 JSONObject 中的 JSONArray
【发布时间】:2018-08-02 21:26:21
【问题描述】:

我有一个JSONObject 和一个JSONArray,还有一个钥匙。我想通过数组iterate,在每个JSONObject中找到颜色为red的所有车型。

这是我目前所拥有的,但它给了我一个JSONException: JSONObject["color"] not found

JSONArray arr = responseBody.getJSONArray("carModels");
String redServices = "";
for(int i = 0; i < arr.length(); i++)
{
    if(arr.getJSONObject(i).get("color").equals("red"))
        redServices += arr.getJSONObject(i).toString() + ", ";      
}

这是一个jsonObject的例子

 {
  "carModels": [
    {
        "toyota": {
            "color": "green"
        }
    },
    {
        "mazda": {
            "color": "red"
        }
    },
    {
        "vw": {
            "color": "red"
        }
    },
    {
        "ford": {
            "color": "red"
        }
    },
    {
        "honda": {
            "color": "black"
        }
    },
    {
        "tesla": {
            "color": "white"
        }
    },

],
"average": "red"
}

【问题讨论】:

  • 你的问题是?
  • JSON 既没有 services 也没有您在代码中使用的 status 字段
  • @KarolDowbecki 刚刚意识到,现在改变了。我试着概括问题
  • 您没有逻辑来处理作为汽车名称的键。您可能应该重组 json,使 carModels 列表中的单个项目如下所示:{'color':'red','manufacturer':'tesla'},然后是 arr.getJSONObject(i).get("color")。 equals("red") 可以工作

标签: javascript java json iteration


【解决方案1】:

尽管我不喜欢 JSONObject,但您需要考虑模型中具有随机值的 JSON 键,例如mazdavw。您可以使用names() 方法找到这个值:

JSONArray carModels = responseBody.getJSONArray("carModels");
for (int i = 0; i < carModels.length(); i++) {
  JSONObject model = carModels.getJSONObject(i);
  JSONArray keys = model.names();
  for (int j = 0; j < keys.length(); j++) {
    Object key = keys.get(j);
    if (model.getJSONObject(key.toString()).get("color").equals("red")) {
      joiner.add(key.toString());
    }
  }
}
System.out.println(joiner);

将输出:

mazda, vw, ford

最好将 JSON 结构更改为具有可预测的键,例如

{
  "carModels": [
  {
    "brand": "toyota",
    "color": "green"
  }
  ...
}

【讨论】:

  • 就像一个魅力!是否可以过滤结果以仅返回汽车型号?
  • @StanY 更新,joiner.add 行已更改
【解决方案2】:

请找到以下适用于给定 json 的代码,您可以根据您的实际 json 对其进行修改:

public String getRedServicesFromJSON(JSONObject object){
    JSONArray arr = object.getJSONArray("carModels");
    StringJoiner joiner = new StringJoiner(", ");
    for(int i = 0;i < arr.length(); i++){
        if("red".equals(arr.getJSONObject(i).getJSONObject(arr.getJSONObject(i).names().getString(0)).get("color")))
            joiner.add(arr.getJSONObject(i).toString());      
    }
    return joiner.toString();
}

【讨论】:

  • 字符串连接器应该使用", ",但是OP应该可能会改变JSON结构。
  • 如果可以的话那就太好了,我通过 API 调用获得了“JSONObject”,因此我无法控制 json。必须使用这种格式
  • @DavidConrad 我正在帮助他进行逻辑部分。这个格式化的事情他可以做。谢谢
  • @StanY 在这种情况下,您可以跳过函数的第一行并可以传递 JSONObject 而不是 String。
  • @StanY 根据您的输入进行编辑。希望对你有帮助。
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2016-07-11
  • 2011-10-05
  • 1970-01-01
  • 2015-09-13
相关资源
最近更新 更多