Как получить значение дочернего узла массива json - PullRequest
0 голосов
/ 14 января 2020

пожалуйста, у меня возникли некоторые проблемы при разборе списка данных по этой ссылке (https://gnews.io/api/v3/top-news?&token=dd21eb88599ccb3411eaad9b314cde23). Я могу получить данные из массива json (статьи), но как я могу получить данные? данные из массива josn (источники)

    private void getWebApiData() {
        String WebDataUrl = "https://gnews.io/api/v3/top-news?&token=dd21eb88599ccb3411eaad9b314cde23";
        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(String result) {
        try {
            JSONObject response = new JSONObject(result);
            JSONObject response2 = response.getJSONObject("articles");
            NewsClass newsClass;
            for (int i = 0; i < newsClass.length(); i++) {
                JSONObject post = newsClass.optJSONObject(i);
                String name = post.optString("name");
                newsClass = new newsClass();
                newsClass.setNews_Name(name);
                artistClassList.add(newsClass);
            }

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

Это код, который я использую для получения данных статей. Чтобы получить исходные тексты, которые я пробовал

    private void parseResult(String result) {
        try {
            JSONObject response = new JSONObject(result);
            JSONObject response2 = response.getJSONArray("articles");
            JSONObject response3 = response2.getJSONObject("sources");
            NewsClass newsClass;
            for (int i = 0; i < newsClass.length(); i++) {
                JSONObject post = newsClass.optJSONObject(i);
                String name = post.optString("name");
                newsClass = new newsClass();
                newsClass.setNews_Name(name);
                artistClassList.add(newsClass);
            }

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

Но я думаю, что я не получаю код правильно

Вот второй вариант, который я пробовал

    private void parseResult(String result) {
        try {
            JSONObject response = new JSONObject(result);

            JSONObject response = response2.getJSONObject("sources");
            NewsClass newsClass;
            for (int i = 0; i < newsClass.length(); i++) {
                JSONObject post = newsClass.optJSONObject(i);
                String name = post.optString("name");
                newsClass = new newsClass();
                newsClass.setNews_Name(name);
                artistClassList.add(newsClass);
            }

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

Но это только дает мне пустой текст. Поля, места для данных заполнены, но они не заполнены. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

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

Как сказал г-н Асадуццаман, на самом деле это массив JSON (точнее, "статей").

Я проверил его на своем телефоне, и он не работает. Вам нужно будет попытаться выяснить, как вы хотите, чтобы JSONArray был проанализирован вами.

private class AsyncTaskExample extends AsyncTask<String, String, String> {


    @Override
    protected void onPreExecute() {

    }
    @Override
    protected String doInBackground(String... strings) {
        try {
            stringURL = new URL(strings[0]);
            HttpURLConnection conn = (HttpURLConnection) stringURL.openConnection();
            conn.setDoInput(true);
            conn.connect();
            is = conn.getInputStream();

            //render string stream
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
            String line;
            String result = "";
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }

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

            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

    @Override
    protected void onPostExecute(String js) {
        super.onPostExecute(js);
        try {
            JSONObject  jay = new JSONObject (js);
            JSONObject source = jay.getJSONObject("articles");

            String s = source.getString("title");
            System.out.println(s);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

}

Здесь вы найдете все, что вам нужно для JSON.

Удачи тебе:)

0 голосов
/ 14 января 2020
JSONObject jsonObject = new JSONObject(response.body().string());
            JSONArray articles = jsonObject.getJSONArray("articles");
            for(int i=0; i<articles.length(); i++){
                JSONObject obj1 = (JSONObject) articles.get(i);
                JSONObject source = obj1.getJSONObject("source");
                Log.i(TAG, "onResponse: " + source.toString()); }

Надеюсь, что вам поможет!

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

Я не знаю, как работает ваш код. Вы пытались получить JSONObject как статей , что на самом деле JSONArray. Помимо этого я не нахожу ключ в ваших json подобных источниках , вместо этого я нашел источник . Для разбора source попробуйте следующий способ:

try {
    JSONObject jsonObject = new JSONObject(result);
    JSONArray jsonArray = jsonObject.getJSONArray("articles");

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

        String name = sourceObject.optString("name");
        String url = sourceObject.optString("url");
    }
} catch (JSONException e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...