Как получить значения ключа из файла json - PullRequest
0 голосов
/ 16 января 2020

Expected Result Как получить значения ключа json в Java, вот мой код

    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, но если бы я мог просто дать мне пустое текстовое поле, ничего не было населен. Я пытался с этим кодом, но значения восстанавливает "ноль"

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

1 Ответ

0 голосов
/ 16 января 2020

Я не уверен, что вы действительно хотите, но если вы просто хотите получить "Амазонит и Аметист", как вы ответили в разделе OP, вы можете попробовать это:

Фрагмент кода

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

Вывод на консоль

["Амазонит", "Аметист"]
Амазонит
Аметист


Обновление

Я не уверен, какое имя вы хотите получить, так как Amazonite и Amethyst два раза появляются в массиве 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
имя: аметист, внутреннее имя: аметист
[амазонит, аметист]
[амазонит, аметист]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...