Ошибка синтаксического анализа JSON, данные не отображаются

Я только начинаю изучать, как использовать JSON в Android. Я должен сделать приложение, которое отображает заголовок, раздел и автора новостей.

Я не совсем уверен, что проблема в синтаксическом анализе или что-то еще, но он постоянно говорит мне, что нет данных.

Так что могу ли я получить помощь по этой части, если у нее есть проблема, чтобы я мог ее исправить или пойти посмотреть, где проблема.

код JSON:

{
   "response": {
        "status": "ok",
        "userTier": "developer",
        "total": 191,
        "startIndex": 1,
        "pageSize": 10,
        "currentPage": 1,
        "pages": 20,
        "orderBy": "relevance",
        "results": [{
            "id": "film/2017/may/25/12-jours-review-raymond-depardon-documentary-psychiatric-hospital-judge",
            "type": "article",
            "sectionId": "film",
            "sectionName": "Film",
            "webPublicationDate": "2017-05-25T15:37:15Z",
            "webTitle": "12 Jours review – a devastating glimpse into broken souls",
            "webUrl": "https://www.theguardian.com/film/2017/may/25/12-jours-review-raymond-depardon-documentary-psychiatric-hospital-judge",
            "apiUrl": "https://content.guardianapis.com/film/2017/may/25/12-jours-review-raymond-depardon-documentary-psychiatric-hospital-judge",
            "fields": {
                "headline": "12 Jours review – a devastating glimpse into broken souls",
                "starRating": "4",
                "shortUrl": "https://gu.com/p/6g6hn",
                "thumbnail": "https://media.guim.co.uk/1dbf594e183ebe5428fe88c82784c55908b4753c/0_0_3598_2160/500.jpg"
            },
            "tags": [{
                "id": "profile/wendy-ide",
                "type": "contributor",
                "sectionId": "film",
                "sectionName": "Film",
                "webTitle": "Wendy Ide",
                "webUrl": "https://www.theguardian.com/profile/wendy-ide",
                "apiUrl": "https://content.guardianapis.com/profile/wendy-ide",
                "references": [],
                "firstName": "wendy",
                "lastName": "ide"
            }],
            "isHosted": false,
            "pillarId": "pillar/arts",
            "pillarName": "Arts"
        }]
    }
}

все что мне нужно это title, section, author и url, Итак, я написал это так:

 private static List<News> extractFeatureFromJson(String newsJSON) {
    if (TextUtils.isEmpty(newsJSON)) {
        return null;
    }
    List<News> news = new ArrayList<>();
    try {


      JSONObject baseJsonResponse = new JSONObject(newsJSON);
        String response = baseJsonResponse.getString("response");
        JSONObject object = new JSONObject(response);;
        JSONArray newsArray=object.getJSONArray("results");
        for (int i = 0; i < newsArray.length(); i++) {
            JSONObject currentNews = newsArray.getJSONObject(i);
            JSONObject results = currentNews.getJSONObject("results");
            String title = results.getString("webTitle");
            String section = results.getString("sectionName");
            String author = results.getString("firstName");
            String url = results.getString("webUrl");

            News nNews = new News(title, section, author, url);

            news.add(nNews);
        }

    } catch (JSONException e) {
        Log.e("QueryUtils", "Problem parsing the news JSON results", e);
    }
    return news;
}

Это новая концепция для меня, и я очень смущен, я был бы очень признателен за помощь.

Редактировать:

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

public void onLoadFinished(Loader<List<News>> loader, List<News> news) {
    View loadingIndicator = findViewById(R.id.loading_indicator);
    loadingIndicator.setVisibility(View.GONE);

    emptyTextView.setText(R.string.no_news);
    newsAdapter.clear();
    if (news != null && !news.isEmpty()) {
        newsAdapter.addAll(news);
    }
}

7 ответов

Решение

Используйте этот код для extractFeatureFromJson

private static List<News> extractFeatureFromJson(String newsJSON) {
    if (TextUtils.isEmpty(newsJSON)) {
        return null;
    }
    List<News> news = new ArrayList<>();
    try {
        JSONObject baseJsonResponse = new JSONObject(newsJSON);
        String response = baseJsonResponse.getString("response");
        JSONObject object = new JSONObject(response);;
        JSONArray newsArray=object.getJSONArray("results");
        for (int i = 0; i < newsArray.length(); i++) {
            JSONObject currentNews = newsArray.getJSONObject(i);
            String title = currentNews.getString("webTitle");
            String section = currentNews.getString("sectionName");
            JSONArray tag = currentNews.getJSONArray("tags");
            String firstName;
            if(tag.length() != 0){
                firstName = tag.getJSONObject(0).getString("firstName");
            }
            String url = currentNews.getString("webUrl");

            News nNews = new News(title, section, author, url);

            news.add(nNews);
        }

    } catch (JSONException e) {
        Log.e("QueryUtils", "Problem parsing the news JSON results", e);
    }
    return news;
}

Вы не должны использовать JSONObject results = currentNews.getJSONObject("results"); потому что вы уже получили массив результатов как JSONArray newsArray=object.getJSONArray("results"); попробуй это

                for (int i = 0; i < newsArray.length(); i++) {            
                JSONObject results = newsArray.getJSONObject(i);
                String title = results.getString("webTitle");
                String section = results.getString("sectionName");
                String author = results.getString("firstName");
                String url = results.getString("webUrl");

                News nNews = new News(title, section, author, url);

                news.add(nNews);
            }

Ваш тип Json неверен! Скобки не совпадают

Удалить эту строку

String response = baseJsonResponse.getString("response");

И изменить эту строку

    JSONObject object = new JSONObject(response);

к

    JSONObject object = baseJsonResponse.getJSONObject("response");

Замените этот цикл в вашем коде, все остальное вроде бы нормально.

   private static List<News> extractFeatureFromJson(String newsJSON) {
        if (TextUtils.isEmpty(newsJSON)) {
            return null;
        }
        List<News> news = new ArrayList<>();
        try {
            JSONObject baseJsonResponse = new JSONObject(newsJSON);
            String response = baseJsonResponse.getString("response");
            JSONObject object = new JSONObject(response);;
            String status = object.getString("status");
            if(status.equals("ok")){
            JSONArray newsArray=object.getJSONArray("results");
            for (int i = 0; i < newsArray.length(); i++) {
                JSONObject currentNews = newsArray.getJSONObject(i);
                JSONObject results = currentNews.getJSONObject("results");
                String title = results.getString("webTitle");
                String section = results.getString("sectionName");
                String author = results.getString("firstName");
                String url = results.getString("webUrl");

                News nNews = new News(title, section, author, url);

                news.add(nNews);
            }
            }else{
                //Invalid response Toast here
            }

        } catch (JSONException e) {
            Log.e("QueryUtils", "Problem parsing the news JSON results", e);
        }
        return news;
    }

Попробуйте этот код,

JSONObject baseJsonResponse = new JSONObject(newsJSON);
     JSONObject resJson =baseJsonResponse.getJSONObject("response");
     String status = resJson.getString("status");
JSONArray newsArray=resJson .getJSONArray("results");
        try
        {

            JSONObject jsonObject = new JSONObject("Your_json");

            // get response object
            JSONObject jsonObjectResponse = jsonObject.getJSONObject("response");

            /*
                get Status string from jsonObjectResponse
                you can also get | userTier | total | startIndex and other strings in this json Object
             */
            String status = jsonObjectResponse.getString("status");

            // get result as Json array from jsonObjectResponse
            JSONArray jsonArrayResults = jsonObjectResponse.getJSONArray("results");
            for (int i = 0; i < jsonArrayResults.length() ; i++)
            {
                JSONObject jsonObjectResult = jsonArrayResults.getJSONObject(i);
                String id = jsonObjectResult.getString("id");
                String type = jsonObjectResult.getString("type");
                String sectionId = jsonObjectResult.getString("sectionId");
                String sectionName = jsonObjectResult.getString("sectionName");
                String webPublicationDate = jsonObjectResult.getString("webPublicationDate");
                String webTitle = jsonObjectResult.getString("webTitle");
                String webUrl = jsonObjectResult.getString("webUrl");
                String apiUrl = jsonObjectResult.getString("apiUrl");
                JSONObject jsonObjectfields = new JSONObject(jsonObjectResult.getString("fields"));
                String fieldHeadLine = jsonObjectfields.getString("headline");
                String fieldStarRating = jsonObjectfields.getString("starRating");
                String fieldShortUrl = jsonObjectfields.getString("shortUrl");
                String fieldThumbnail = jsonObjectfields.getString("thumbnail");

                JSONArray jsonArrayTags = jsonObjectResult.getJSONArray("tags");
                for (int j = 0; j < jsonArrayTags.length(); j++)
                {
                    JSONObject jsonObjectTags = jsonArrayTags.getJSONObject(j);
                    String tagID = jsonObjectTags.getString("id");
                    String tagType = jsonObjectTags.getString("type");
                    String tagSelectionID = jsonObjectTags.getString("sectionId");
                    String tagSectionName = jsonObjectTags.getString("sectionName");
                    // iam just get 4 string ! you can get all tags string with replacing
                }
                //** and get others  each jsonObject from result Array
            }



        }
        catch (JSONException e)
        {
            e.printStackTrace();
            // when parse json error happend! check log  cat 
        }

этот код разобрать эту ссылку

Я взял только несколько предметов из каждой части, чтобы прояснить дело

Другие вопросы по тегам