【问题标题】:Get data from nested JSON Object in Java Android从 Java Android 中的嵌套 JSON 对象获取数据
【发布时间】:2021-10-24 19:21:57
【问题描述】:

如何使用 JSONOBJECT 获取“字段”对象 0、1、2、3、4 以及每个对象的“名称”对象字符串

 [
    {
        "name": "Bank1",
        "fields": {
            "0": {
                "name": "Email",
                "slug": "email",
                "type": "input"
            },
            "1": {
                "name": "City",
                "slug": "city",
                "type": "input"
            },
            "2": {
                "name": "Screenshot",
                "slug": "screenshot",
                "type": "file"
            },
            "3": {
                "name": "Full Name",
                "slug": "full-name",
                "type": "input"
            }
        },
        "status": "Active"
    },
    {
        "name": "Bank2",
        "fields": {
            "0": {
                "name": "Email",
                "slug": "email",
                "type": "input"
            },
            "1": {
                "name": "City",
                "slug": "city",
                "type": "input"
            },
            "2": {
                "name": "Screenshot",
                "slug": "screenshot",
                "type": "file"
            },
            "4": {
                "name": "Submitted Date",
                "slug": "submitted-date",
                "type": "calendar"
            }
        },
        "status": "Active"
    }
]

&这是我尝试做的事情

public void onResponse(String response) {
                        try {
                            JSONArray jsonArray = new JSONArray(response);
                         
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);

                               
                                String p_name = jsonObject.getString("name");
                                JSONObject jo = jsonObject.getJSONObject("fields");

                                String j1 = jo.getString("0");
                                if (!j1.isEmpty()){
                                    JSONObject jo1 = jo.getJSONObject("0");
                                    String f_name1 = jo1.getString("name");
                                    Log.d("Field1.", f_name1);
                                }
}}catch block...

但问题是,它给了我对象 null 的值,例如 [value 4 is null] 因为在字段的第一个对象中没有 4 的对象。请帮我解决这个问题,感谢您的回答谢谢:)

【问题讨论】:

  • 使用JSONObject.keys 迭代属性
  • 感谢@Selvin 的回答

标签: java android arrays json object


【解决方案1】:

您可以使用keys() json 对象的迭代器并使用while (keys.hasNext()) 在其上循环

对于您的示例,它看起来像这样:

private void parseJson(String response) {
        try {
            JSONArray jsonArray = new JSONArray(response);

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);

                JSONObject jo = jsonObject.getJSONObject("fields");

                Iterator<String> keys = jo.keys();
                while (keys.hasNext()) {
                    String key = keys.next();
                    JSONObject jo1 = jo.getJSONObject(key);
                    String f_name1 = jo1.getString("name");
                    Log.d("Field1.", f_name1);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

【讨论】:

  • 感谢您的回答,但是有没有办法将它一个一个地添加到数组列表中,仅第一个字段对象,然后是下一个 @Mayur Gajra
【解决方案2】:

在我的 IDE/JDK11 中正确获取所有密钥存在一些问题,因此我决定基于 @MayurGajra 解决方案循环 ArrayList,例如:

private static List<List<String>> parseJson(String response) throws JSONException {
    JSONArray jsonArray = new JSONArray(response);
    List<List<String>> result = new ArrayList<>();

    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        JSONObject jo = jsonObject.getJSONObject("fields");

        List<Object> list = new ArrayList<>();
        jo.keys().forEachRemaining(list::add);
        List<String> subList = new ArrayList<>();

        for (Object o : list) {
            String key;
            if (isString(o))
                key = (String) o;
            else
                continue;
            JSONObject jo1 = jo.getJSONObject(key);
            String f_name1 = jo1.getString("name");
            subList.add(f_name1);
        }
        result.add(subList);
    }
    return result;
}

private static boolean isString(Object o) {
    try {
        String result = (String) o;
    } catch (ClassCastException e) {
        return false;
    }
    return true;
}

对上面的json进行处理后得到的结果如下:

[[Email, City, Screenshot, Full Name], [Email, City, Screenshot, Submitted Date]]

但它不必是列表列表;)

-- 编辑--

仅获取标记为“名称”的元素的第一个列表:

    try {
        System.out.println(parseJson(yourJsonAsString).get(0).toString());
    } catch (JSONException e) {
        System.out.println("JSONException:" + e.getMessage());
    }

上面的结果是:

[Email, City, Screenshot, Full Name]

【讨论】:

  • 根据你的回答意味着它只给我特定的索引值或每个字段对象
  • 好吧,但是您在上面写道,您正在寻找一种方法来“仅将第一个字段对象和下一个字段对象逐个添加到数组列表中”。我误会你了吗?
  • 我已经更新了我的问题@Andrzej Więcławski
  • 而且你从每个对象中得到了第四个元素,不管键有什么。该算法不关注密钥的数字顺序是否保持不变。它可以是 0,1,2,4 或 0,1,2,4。您是否期望 0、1、2、3、4 键的两个结果?
  • 不,可能有 0123 或可能是 012 或所有五个 01234
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 2017-02-13
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2020-05-10
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多