簡體   English   中英

如何獲取json文件的鍵的值

[英]How to get the values of a key of a json file

預期結果 我如何在 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"
          }
        }
      ]
    }
  ]
}

我想要的是如何獲取 Alphabet A 下的數據值,即 Amazonite 和 Amethyst,以及 Alphabet 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();
        }
    }

我不確定你真正想要什么,但如果你只是想在 OP 下回復“Amazonite and Amethyst”,你可以試試這個:

代碼片段

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"));
        });
    }
}

控制台輸出

[“亞馬遜石”、“紫水晶”]
亞馬遜
紫晶


更新

我不確定您要檢索哪個名稱,因為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
名稱:紫水晶,內名:紫水晶
[亞馬遜石,紫水晶]
[亞馬遜石,紫水晶]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM