Pregunta

Estoy usando JSOUP para raspar algunos datos HTML y está funcionando muy bien. Ahora necesito extraer un contenido JSON (solo JSON, no HTML). ¿Puedo hacer esto fácilmente con JSoup o tengo que hacerlo usando otro método? El análisis que realiza JSOUP está codificando los datos de JSON, por lo que no se analiza correctamente con GSON.

¡Gracias!

¿Fue útil?

Solución

Mientras que es genial, Jsoup es un analizador HTML, no un analizador JSON, por lo que es inútil en este contexto. Si alguna vez lo intentas, Jsoup pondrá al JSON devuelto implícitamente en un <html><head> y así. No quieres tener eso. GSON es un analizador JSON, por lo que definitivamente lo necesitas.

Es probable que su problema concreto no sepa cómo alimentar una URL que devuelve un JSON a GSON. En ese caso, debe usar URL#openStream() Para conseguir un InputStream de eso y usar InputStreamReader para decorarlo en un Reader que finalmente se puede alimentar a Gson#fromJson() que acepta un Reader.

InputStream input = new URL("http://example.com/foo.json").openStream();
Reader reader = new InputStreamReader(input, "UTF-8");
Data data = new Gson().fromJson(reader, Data.class);
// ...

Otros consejos

JSoup no está diseñado para analizar JSON. Use GSON (o cualquier otra biblioteca Java JSON). Para obtener contenido remoto con JSOUP, use esto:

Connection  con = HttpConnection.connect(url);
con.method(Method.POST).data(data.params).ignoreContentType(true);
Response resp = con.execute();
String body = resp.body();

JSoup no analiza JSON, pero se puede usar para obtener datos JSON fácilmente.

package com.zetcode;

import com.google.gson.Gson;
import java.io.IOException;
import org.jsoup.Jsoup;

class TimeData {

    private String time;
    private Long milliseconds_since_epoch;
    private String date;

    @Override
    public String toString() {
        return "TimeData{" + "time=" + time + ", milliseconds_since_epoch=" 
                + milliseconds_since_epoch + ", date=" + date + '}';
    }
}


public class GsonReadWebPage {

    public static void main(String[] args) throws IOException {

        String webPage = "http://time.jsontest.com";

        String data = Jsoup.connect(webPage).ignoreContentType(true).execute().body();

        Gson gson = new Gson();
        TimeData td = gson.fromJson(data, TimeData.class);

        System.out.println(td);
    }
}

El ejemplo lee los datos de JSON de http://time.jsontest.com con JSoup y Parses JSON con GSON. Para ejecutar este ejemplo, necesita dependencias JSOUP y GSON.

No sé sobre JSoup, pero si es JSON válido, entonces GSON debería poder decodificar (puede necesitar algunos deserializadores personalizados para sus clases personalizadas).

Si no es JSON válido y está recibiendo errores, entonces hay un error en JSOUP.

He visto muchas respuestas y personas que escriben páginas de código, no tengo idea de por qué, pero puedes hacerlo fácilmente con GSON.

/**
 * Convert json string to json object
 */
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

private JsonObject getResAsJson(String response) {
    return new JsonParser().parse(response).getAsJsonObject();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top