提问人:potatolol 提问时间:8/21/2023 更新时间:8/21/2023 访问量:51
在 Android Studio Java 中解析/提取 json
Parsing/Fetching json in Android Studio Java
问:
我希望 Fetch 按钮仅显示/列出对象 1 中 a 和 b 的值
{ "1": {
"a": "a",
"b": "b",
"2": {"a":"a2",
"b":"b2"
},
"5": {
"a": "a2",
"b": "b2"
}
}
}
我不知道如何获取它,我尝试将许多教程组合在一起,即使它们是 100 行代码 "
try {
URL url = new URL("https://api.npoint.io/ba77aacc0972af3c686a");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = bufferedReader.readLine()) != null){
data = data + line;
}
if (!data.isEmpty()){
JSONObject jsonObject = new JSONObject(data);
JSONArray one = jsonObject.getJSONArray("1");
userList.clear();
for (int i = 0;i < one.length();i++){
JSONObject values = one.getJSONObject(i);
String a = values.getString("a");
userList.add(a);
String b = values.getString("b");
userList.add(b);
我不知道如何获取它,我尝试将许多教程组合在一起,即使它们是 100 行代码
答:
0赞
Tsyshiu
8/21/2023
#1
您是否尝试从对象 1 中获取任何级别的 a 和 b 的所有值,这意味着您希望从示例 json 中获取 a 和 b 的列表:[a,b,a2,b2,a2,b2]
{
"1": {
"a": "a",
"b": "b",
"2": {
"a": "a2",
"b": "b2"
},
"5": {
"a": "a2",
"b": "b2"
}
}
}
首先,你必须得到 JSONObject 1,而不是 JSONArray 1。然后,您可以在 JSONObject 1 中维护任何 JSONObject 子级的堆栈,并迭代该堆栈,直到它为空。在每次迭代中,检查键“a”和“b”是否包含在当前 JSONObject 子项中,并将当前 JSONObject 的任何 JSONObject 子项推送到堆栈。
List<String> userList = new ArrayList<>();
if (!data.isEmpty()) {
JSONObject jsonObject = new JSONObject(data);
// use JSONObject to get JSONObject 1
JSONObject one = jsonObject.getJSONObject("1");
userList.clear();
// a stack to hold any child JSONObject which may contain key "a" and key "b"
Stack<JSONObject> stack = new Stack<>();
stack.push(one);
while (!stack.isEmpty()) {
JSONObject currentJSONObject = stack.pop();
if (currentJSONObject.has("a")) {
userList.add(currentJSONObject.getString("a"));
}
if (currentJSONObject.has("b")) {
userList.add(currentJSONObject.getString("b"));
}
// add any child JSONObject to the stack
for (String key : currentJSONObject.keySet()) {
Object object = currentJSONObject.get(key);
if (object instanceof JSONObject) {
stack.push((JSONObject) object);
}
}
}
System.out.println(userList);
}
0赞
Sarah
8/21/2023
#2
看起来你的代码走在正确的轨道上,但需要进行一些修改。让我们一步一步地分解这个过程:
获取 JSON 数据:您使用 URL 和输入流正确获取 JSON 数据。
解析 JSON:您正在从获取的数据创建 JSONObject。但是,在 JSON 结构中,“1”对象包含子对象“2”和“5”,因此您应该访问“2”对象,而不是尝试遍历“1”数组。
下面介绍如何修改代码以实现所需的效果:
try {
URL url = new URL("https://api.npoint.io/ba77aacc0972af3c686a");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
StringBuilder data = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
data.append(line);
}
if (!data.toString().isEmpty()) {
JSONObject jsonObject = new JSONObject(data.toString());
JSONObject object1 = jsonObject.getJSONObject("1");
JSONObject object2 = object1.getJSONObject("2"); // Access the "2" object
String a = object2.getString("a");
String b = object2.getString("b");
// Now you have the values of "a" and "b" from object 2
// You can use these values as needed (e.g., display them in UI)
}
} catch (Exception e) {
e.printStackTrace();
}
在此代码中,我们访问“1”对象中的“2”对象,然后从“2”对象中检索“a”和“b”的值。您可以将注释替换为所需的实现,无论是在 UI 中显示这些值还是将它们用于任何其他目的。
评论