Разбор Android JSON с тегами HTML

Я хочу проанализировать JSON из URL-адреса, который находится внутри тегов <HTML> в Android, используя JsonReader. Я пробовал несколько примеров в справочнике Stackoverflow и Androud, но я продолжаю получать ошибку org.json.JSONException: Value <!DOCTYPE или null pointer exception

Это URL-адрес, который я хочу разобрать: Ссылка

Это код, который у меня есть, используя этот пример: Как анализировать JSON в Android

Я получаю исключение nullpointException для класса getData

Класс парсера JSON:

public class JSONParser
{
    public String json = "";
    public InputStream is = null;
    public JSONObject jObj = null;

public JSONObject getJSON(String url)
{
    try
    {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
       e.printStackTrace();
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    // return JSON String
    return jObj;
}

КартыАктивность:

private void setUpMap()
{
    new getData().execute();
}

class getData extends AsyncTask<String, String, String>
{
    @Override
    protected String doInBackground(String... params)
    {
        JSONParser jsonParser = new JSONParser();
        JSONObject json = jsonParser.getJSON(url);

        try
        {
            String id = json.getString("ID");
            String name = json.getString("Name");
            long lat = json.getLong("Lat");
            long lng = json.getLong("Long");
            String sms = json.getString("Sms");
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

person user1281921    schedule 04.03.2015    source источник
comment
JSON Parser читает только значения в формате JSON, в противном случае выдает ошибку.. если вы получаете HTML-теги в ответ, это означает, что на вашей странице .php есть какое-то предупреждение или ошибка.. сначала вам нужно решить это, а затем даст вам ответ в формате JSON   -  person Pragnesh Ghoda シ    schedule 04.03.2015
comment
пожалуйста, дайте полный логкэт... И как вы подходите к разбору этого.   -  person Rituraj suman    schedule 04.03.2015
comment
Это только мне кажется довольно странным, что ссылка возвращает действительный JSON, но все же обернута в html-страницу, а тип контента установлен в text/html, почему бы просто не использовать application/json? Я не вижу смысла делать это html-ответом...   -  person Jimmy    schedule 04.03.2015
comment
Я думаю, что страница дает вам объект JSONArray, а не JSONObject, я думаю   -  person Preethi Rao    schedule 04.03.2015
comment
@ Прити Рао, ты был прав. это было в массиве.   -  person user1281921    schedule 04.03.2015
comment
Привет! Посмотрите мой ответ stackoverflow.com/questions/25332240/   -  person Umar Ata    schedule 18.05.2017


Ответы (5)


Я использовал этот метод для удаления HTML из ответа JSONhtml: Как для удаления или экранирования HTML-тегов в Android

public String stripHtml(String html)
{
    return Html.fromHtml(html).toString();
}

Затем извлек JSONArray вместо объекта

HttpEntity entity = response.getEntity();
String data = EntityUtils.toString(entity); 
String noHTML = stripHtml(data);

JSONArray jsonArray = new JSONArray(noHTML);

for(int i = 0; i < jsonArray.length(); i++)
 {
     StopInfo stops = new StopInfo();
     JSONObject jsonObject = jsonArray.getJSONObject(i);

     stops.id = jsonObject.getString("ID");
     stops.name = jsonObject.getString("Name");
     stops.lat = jsonObject.getLong("Lat");
     stops.lng = jsonObject.getLong("Long");
     stops.sms = jsonObject.getString("Sms");

     stopArrayList.add(stops);
 }
person user1281921    schedule 04.03.2015

Вам нужно будет извлечь компонент JSON со страницы HTML. Один из способов сделать это для этой структуры будет примерно таким:

// If `html` is the full HTML string
String json = html.substring(html.indexOf("["), html.lastIndexOf("]") + 1);
person Andrew Magee    schedule 04.03.2015

Это ошибка веб-сайта. Запрос Json не находится в тегах html. Но вы можете легко заменить его из строки запроса. Или вы можете выполнить синтаксический анализ с помощью Jsoup следующим образом:

Document doc = Jsoup.Parse(request);
String parsedrequest = doc.text();
person Selim YILDIZ    schedule 04.03.2015

Вы можете выполнить это как http-запрос к серверу, выполнить его в отдельном потоке (может быть асинхронной задачей).

    HttpClient client = new DefaultHttpClient();
    HttpGet getRquest = new HttpGet(urlLink);
    try {
        HttpResponse respnse = client.execute(getRquest);
        StatusLine statusLine = respnse.getStatusLine();
        String responseS = statusLine.getReasonPhrase();
        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
            HttpEntity entity = respnse.getEntity();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            entity.writeTo(out);

            responseS = out.toString();
            out.close();
            out = null;
        }

Ответом будет ваша строка json. Ваша строка ответа - JSONArray, поэтому

JSONArray js = new JSONArray(jsonString);

Надеюсь, что это работает

Просмотрите свои данные Json с помощью онлайн-парсера json.

person Preethi Rao    schedule 04.03.2015

Похоже, вы пытаетесь проанализировать исходный код по какой-то причине.

Взгляните на эту ссылку, она поможет вам правильно проанализировать JSON. форматированный ответ.

person Kony2013    schedule 04.03.2015
comment
Это тот, который я тоже пробовал, но получил эту ошибку :( - person user1281921; 04.03.2015
comment
не могли бы вы опубликовать код, который вы используете для захвата и анализа ответа? Если вы получаете теги HTML, вы каким-то образом захватываете источник страницы, а не фактический контент. - person Kony2013; 04.03.2015
comment
Привет, я отредактировал свой пост, чтобы показать, что я сделал из примера. - person user1281921; 04.03.2015