在 Android Studio Java 中解析/提取 json

Parsing/Fetching json in Android Studio Java

提问人:potatolol 提问时间:8/21/2023 更新时间:8/21/2023 访问量:51

问:

我希望 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 行代码

Android JSON 对象 解析 提取

评论

0赞 Community 8/21/2023
请编辑问题,将其限制在特定问题上,并具有足够的细节以确定适当的答案。

答:

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 中显示这些值还是将它们用于任何其他目的。