【问题标题】:How to get the values of a key of a json file如何获取json文件的键值
【发布时间】:2020-05-02 19:09:54
【问题描述】:

如何在 Java 中获取 json 键的值这是我的代码

    private void getWebApiData() {
        String WebDataUrl = "myjsonfileurl";
        new AsyncHttpTask.execute(WebDataUrl);
    }

    @SuppressLint("StaticFieldLeak")
    public class AsyncHttpTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {
            String result = "";

            URL url;
            HttpsURLConnection urlConnection = null;
            try {
                url = new URL(urls[0]);
                urlConnection = (HttpsURLConnection) url.openConnection();
                if (result != null) {
                    String response = streamToString(urlConnection.getInputStream());
                    parseResult(response);
                    return result;
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                newsAdapter = new NewsAdapter(getActivity(), newsClassList);
                listView.setAdapter(newsAdapter);
                Toast.makeText(getContext(), "Data Loaded Successfully", Toast.LENGTH_SHORT).show();

            } else {
                Toast.makeText(getContext(), "Failed to load data!", Toast.LENGTH_SHORT).show();
            }
            progressBar.setVisibility(View.GONE);
        }
    }

    private String streamToString(InputStream stream) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
        String line;
        String result = "";
        while ((line = bufferedReader.readLine()) != null) {
            result += line;
        }

        // Close stream
        if (null != stream) {
            stream.close();
        }
        return result;
    }

    private void parseResult_GetWebData(String result) {
        try {
            JSONObject jsonObject = new JSONObject(result);
            JSONArray jsonArray = jsonObject.getJSONArray("books");

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject articleObject = jsonArray.getJSONObject(i);
                JSONObject sourceObject = articleObject.getJSONObject("A");

                String name = sourceObject.optString("name");

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

我的 json 文件

{
  "books": [
    {
      "A": [
        {
          "Amazonite": {
            "name": "Amazonite",
            "image": "www.google.com"
          },
          "Amethyst": {
            "name": "Amethyst",
            "image": "www.google.com"
          }
        }
      ],
      "B": [
        {
          "Beryl": {
            "name": "Beryl",
            "image": "www.google.com"
          },
          "BloodStone": {
            "name": "Bloodstone",
            "image": "www.google.com"
          }
        }
      ]
    }
  ]
}

我想要的是如何获取字母 A 下的数据值,即 Amazonite 和 Amethyst 以及字母 B 下的数据值,但我可以只给我空文本字段,没有任何数据被填充。 我已尝试使用此代码,但值返回“null”

    private void parseResult_GetWebData(String result) {
        try {
            JSONObject jsonObject = new JSONObject(result);
            JSONArray jsonArray = jsonObject.getJSONArray("books");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject articleObject = jsonArray.getJSONObject(i);
                String name = String.valueOf(articleObject.optJSONObject("A"));
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

【问题讨论】:

  • A 是一个 JSON 数组,所以你应该改用 articleObject.optJSONArray("A")
  • 试过了,但我得到了 A 节点的完整字符串 "[ { "Amazonite": { "name": "Amazonite", "image": "www.google.com" }, "Amethyst": { "name": "Amethyst", "image": "www.google.com" } } ],"什么是“Amazonite and Amethyst”的关键
  • 我只是指出为什么你得到null 变量name

标签: java android arrays json android-studio


【解决方案1】:

我不确定你真正想要什么,但如果你只是想获得“亚马逊石和紫水晶”,就像你在 OP 下的回复一样,你可以试试这个:

代码 sn-p

for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject articleObject = jsonArray.getJSONObject(i);
    JSONArray jsonArrayA = articleObject.getJSONArray("A");

    for (int j = 0; j < jsonArrayA.length(); j++) {
        JSONObject obj = jsonArrayA.getJSONObject(j);
        System.out.println(obj.names());

        obj.names().forEach(e -> {
            System.out.println(obj.getJSONObject(e.toString()).get("name"));
        });
    }
}

控制台输出

[“亚马逊石”,“紫水晶”]
亚马逊石
紫水晶


更新

我不确定您要检索哪个name,因为AmazoniteAmethyst 在JSON 数组A 中出现了两次,所以我提供了两种显示方式,如下所示:

List<String> names = new ArrayList<>();
List<String> innerNames = new ArrayList<>();
for (int j = 0; j < jsonArrayA.length(); j++) {
    JSONObject obj = jsonArrayA.getJSONObject(j);
    JSONArray keys = obj.names();
    for (int k = 0; k < keys.length(); k++) {
        String name = keys.getString(k);
        String innerName = obj.getJSONObject(keys.optString(k)).getString("name");

        System.out.printf("name: %s, inner name: %s\n", name, innerName);

        names.add(name);
        innerNames.add(innerName);
    }
}
System.out.println(names.toString());
System.out.println(innerNames.toString());

控制台输出

名称:Amazonite,内部名称:Amazonite
名称:紫水晶,内名:紫水晶
[亚马逊石、紫水晶]
[亚马逊石,紫水晶]

【讨论】:

  • 我能够得到第一个结果是 "["Amazonite","Amethyst"]" 但我想要的是第二个选项来获取数据作为单独的字符串,因为我将它填充在一个listview 我正在使用 android studio,所以我需要将结果作为字符串而不是 system.out.printIn 就像在常规 java 中那样,但这作为 lambda 表达式 "bj.names().forEach(e -> { System.out.println(obj .getJSONObject(e.toString()).get("name")); });" ForEach 行要准确,请您将答案作为字符串发布在 android studio 中
  • @Serenity 嗨,我已经更新了我的帖子,但我仍然不确定你到底想要什么。
  • 谢谢,但我想要显示的只是 Amazonite 和 Amethyst,而不是其中的全部数据,我已经用预期的结果编辑了我的问题
  • @Serenity 已更新,请查看!
  • 谢谢,但我只得到一个值,即“Amethyst”和“Amethyst”第一个值没有被填充它只是重复相同的值,抱歉给您带来不便
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多