从 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 对象获取数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上通过 GSON 从嵌套 JSON 数组中获取价值? [复制]