【问题标题】:How to get the value of a child node of a json array如何获取json数组的子节点的值
【发布时间】:2020-05-01 10:28:52
【问题描述】:

请我在解析此链接中的数据列表时遇到一些问题(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();
        }
    }

但这只会给我空文本字段填充数据的空格但它是空白的 请任何帮助将不胜感激

【问题讨论】:

    标签: java android arrays json android-studio


    【解决方案1】:

    我不知道您的代码是如何工作的。您尝试将JSONObject 作为articles,实际上是JSONArray。除此之外,我在您的 json 中没有找到任何 key,例如 sources,而是找到了 source。要解析 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();
    }
    

    【讨论】:

    • 感谢一百万真的很感谢它按预期工作
    • 请检查:stackoverflow.com/a/59816944/7926186 与此问题类似,我无法得到正确答案
    • @Serenity,检查我的答案:stackoverflow.com/a/59836346/2637449
    • 请检查这个:stackoverflow.com/q/59850922/7926186 我已经发布了另一个完整代码的问题,因为应用程序在尝试您的代码后返回空数据我不能说代码是否是其他地方错了
    【解决方案2】:

    正如 Asaduzzaman 博士所说,它实际上是一个 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 所需的一切。

    祝你好运:)

    【讨论】:

    • 非常感谢,非常感谢
    【解决方案3】:
    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()); }
    

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2013-04-19
      相关资源
      最近更新 更多