从 Java Android 中的嵌套 JSON 对象获取数据

Posted

技术标签:

【中文标题】从 Java Android 中的嵌套 JSON 对象获取数据【英文标题】:Get data from nested JSON Object in Java Android 【发布时间】: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 的回答 【参考方案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

以上是关于从 Java Android 中的嵌套 JSON 对象获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从Java Android中的嵌套JSON获取数据

从没有名称Android的嵌套数组JSON获取数据

在 Android 上通过 GSON 从嵌套 JSON 数组中获取价值? [复制]

在 Android Studio 中将嵌套的 JSON 反序列化为 Java

在java Android中获取JSON嵌套对象的特定索引

Android Retrofit 数组列表中的嵌套 JSON 对象