Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    JSON con Yahoo Weather: come ottenere i dati

    Ciao ragazzi, vorrei realizzare un piccolo programmino che visualizzi le condizioni meteo attuali del mio paese. Per fare ciò mi affido a Yahoo Weather attraverso la console YQL: https://developer.yahoo.com/yql/cons...oeid%3D2502265 e ottengo i risultati qui di seguito: https://query.yahooapis.com/v1/publi...true&callback=
    Conosco Java (ci lavoro dal 2006), mi sono letto un po' di JSON e dei suoi principi (interessante come argomento) ma vorrei trovare una classe oppure un tutorial (anche una guida) che mi permetta di ottenere le informazioni attraverso JSON ottenuto da Yahoo (YQL più precisamente).
    Qualcuno cortesemente potrebbe fornirmi una classe semplicissima che mi permetta di capire comeottenere i dati?
    Ho cercato in rete ma molti esempi/tutorial si basano su strutture dati JSON "semplici" e nessuno invece mi spiega come interfacciarmi con JSON ottenuto con YQL.

    Vi ringrazio per il vostro aiuto! Scusatemi ma sono un poco disperato!
    Se riuscirò a trovare un sistema per interfacciarmi alla struttura JSON di Yahoo, prometto di pubblicare un articolo su come fare in futuro (con riferimento a chi mi ha aiutato!).
    Grazie a tutti voi!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Puoi spiegarti meglio?
    Nel senso... io non ho capito se ti serve una libreria per lavorare con oggetti JSON o se non riesci a usare tale libreria o se non sai come leggere la response di quella URL o se hai altri problemi.

    Di sicuro ti serve una libreria per trattare oggetti JSON. La cosa più semplice è andare nel sito ufficiale di JSON, scaricare i primi 7 file Java che sono elencati, compilarli e incapsularli in un JAR che potrai poi utilizzare in qualunque tua applicazione.

    Poi si tratta di creare un oggetto URL con la stringa che hai postato qui sul forum, ottenere una URLConnection, aprire la connessione ed ottenere l'InputStream per andare a leggere la response, prendere la stringa (che rappresenta il JSON) e con questa creare un'istanza di JSONObject che utilizzerai a tuo piacimento.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Certo! Scusami se non sono stato chiaro.
    Il mio problema è che non so come gestire la risposta di quella URL: la risposta è formata da vari oggetti ("query", "result", ...) e alcuni oggetti sono array di oggetti (basta vedere la struttura della URL nella YQL).
    Io utilizzo, come libreria, la JSON-LIB ma posso adottare anche altre librerie (tipo la GSON). Avevo bisogno di un semplice esempio di classe Java da cui partire.
    Ho capito i primi passaggi che hai indicato (creare oggetto indicando la URL, ottenere la URLConnection) ma poi non saprei come trattare l'InputStream.
    Magari mi sto perdendo in un bicchiere d'acqua ma ho visto tanti tutorial/esempi che però mi hanno generato molta confusione...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Power Dragon Visualizza il messaggio
    Il mio problema è che non so come gestire la risposta di quella URL: la risposta è formata da vari oggetti ("query", "result", ...) e alcuni oggetti sono array di oggetti (basta vedere la struttura della URL nella YQL).
    Le strade sono (almeno) due:
    1) Leggi la stringa JSON e utilizzando una API Java per JSON (Google GSON, Jackson, ....) estrai tu i dati. Cioè o enumeri i vari oggetti/array leggendo proprietà, valori ecc.... o eventualmente "mappi" il JSON in classi Java (se/come inteso e possibile per la libreria JSON scelta). Chiaramente questo significa che devi conoscere veramente bene la struttura di quel JSON: l'innestamento dei dati, i nomi delle proprietà, i tipi dei valori, ecc... E devi essere preparato ad aggiornare il tutto per adattarti ad eventuali modifiche al JSON fatte da chi lo produce.

    2) Trovi e usi una libreria Java che sta ad un livello più "alto", che fa da "wrapper" (più o meno leggero) per una certa API, nel tuo caso la Yahoo Weather API. Non devi più "sapere" nulla sul JSON, è la libreria che fornisce una API Java ad oggetti che maschera il tutto.
    Una veloce ricerca di 10 sec. con Google e ho trovato: https://github.com/fedy2/yahoo-weather-java-api
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questo è un esempio molto molto banale (e assolutamente senza fronzoli, né gestione eccezioni o altro) che usa il JSON di Yahoo Weather e la libreria che ho linkato sopra:


    codice:
        public static void main(String[] args) throws Exception {
            String urlPrefix = "https://query.yahooapis.com/v1/public/yql?q=";
            String urlSuffix = "&format=json&diagnostics=true&callback=";
            
            // Query da eseguire su Yahoo Weather
            String urlQuery = "select * from weather.forecast where woeid=2502265";
            
            // Costruisco l'URL (avendo l'accortezza di fare l'encoding della query)
            URL myURL = new URL(urlPrefix + URLEncoder.encode(urlQuery, "UTF-8") + urlSuffix);
            
            // Ottengo la connessione al servizio
            URLConnection con = myURL.openConnection();
            
            // Preparo lo StringBuilder che accoglierà il JSON
            StringBuilder myJson = new StringBuilder();
            
            // Eseguo la request e leggo il risultato
            InputStream is = con.getInputStream();
            
            // Essendo che ricevo un JSON (quindi una stringa) posso usare in Reader
            InputStreamReader reader = new InputStreamReader( is );
            BufferedReader br = new BufferedReader( reader );
            String line = null;
            
            // Leggo finchè ci sono dati da leggere
            while((line = br.readLine()) != null) {
                myJson.append( line );
            }
            
            // Ho finito, chiudo la connessione
            br.close();
            
            // Costruisco il JSON
            JSONObject json = new JSONObject( myJson.toString() );
            
            // Ci faccio quel che devo.
            // Ad esempio, stampo le previsioni per tutti i giorni:
            JSONObject jsonQuery = json.getJSONObject("query");
            JSONObject queryResults = jsonQuery.getJSONObject("results");
            JSONObject channel = queryResults.getJSONObject("channel");
            JSONObject resItem = channel.getJSONObject("item");
            JSONArray forecasts = resItem.getJSONArray("forecast");
            for(int i=0; i<forecasts.length(); i++) {
                JSONObject fc = forecasts.getJSONObject( i );
                
                System.out.println("Data: " + fc.getString("date"));
                System.out.println("Previsione: " + fc.getString("text"));
                System.out.println();
            }
        }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Ok, ragazzi! Grazie mille e ci siamo quasi! Vi chiedo cortesemente un altro piccolo aiuto se possibile.
    Io ho scelto la 2° opzione (wrapper) -> ho scaricato la yahoo-weather-java-api. Questa libreria mi chiede una particolare dipendenza: SLF4J (ho scaricato l'ultima distribuzione slf4j-1.7.7.zip).
    Ho aperto un nuovo progetto in Eclipse e prelevato la classe di esempio che trovate qui sotto:
    Codice PHP:
    /**
     * 
     */
    package com.github.fedy2.weather.test;

    import java.io.IOException;

    import javax.xml.bind.JAXBException;

    import com.github.fedy2.weather.YahooWeatherService;
    import com.github.fedy2.weather.data.Channel;
    import com.github.fedy2.weather.data.unit.DegreeUnit;

    /**
     * @author "Federico De Faveri defaveri@gmail.com"
     *
     */
    public class Example {

        
    /**
         * @param args
         * @throws JAXBException 
         * @throws IOException 
         */
        
    public static void main(String[] argsthrows JAXBExceptionIOException {
            
    YahooWeatherService service = new YahooWeatherService();
            
    Channel channel service.getForecast("670807"DegreeUnit.CELSIUS);
            
    System.out.println(channel.getDescription());
        }


    e poi ho copiato la classe "YahooWeatherService.java" nel mio progetto (copia e incolla scompattando l'archivio yahoo-weahter-api.zip").
    Però c'è un problema: chiede la SLF4J -> ho scompattato l'archivio e mi ritrovo con un sacco di file Jar... Intuisco che dovrei fare un "Add External Jar File" ma ho provato a mettere tutti i file Jar trovarti ma mi restituisce ancora qualche errore... Mamma mia che sfortuna!
    Voi che siete molto più esperti di me, che posso fare?

  7. #7
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Questo è un esempio molto molto banale (e assolutamente senza fronzoli, né gestione eccezioni o altro) che usa il JSON di Yahoo Weather e la libreria che ho linkato sopra:


    codice:
        public static void main(String[] args) throws Exception {
            String urlPrefix = "https://query.yahooapis.com/v1/public/yql?q=";
            String urlSuffix = "&format=json&diagnostics=true&callback=";
            
            // Query da eseguire su Yahoo Weather
            String urlQuery = "select * from weather.forecast where woeid=2502265";
            
            // Costruisco l'URL (avendo l'accortezza di fare l'encoding della query)
            URL myURL = new URL(urlPrefix + URLEncoder.encode(urlQuery, "UTF-8") + urlSuffix);
            
            // Ottengo la connessione al servizio
            URLConnection con = myURL.openConnection();
            
            // Preparo lo StringBuilder che accoglierà il JSON
            StringBuilder myJson = new StringBuilder();
            
            // Eseguo la request e leggo il risultato
            InputStream is = con.getInputStream();
            
            // Essendo che ricevo un JSON (quindi una stringa) posso usare in Reader
            InputStreamReader reader = new InputStreamReader( is );
            BufferedReader br = new BufferedReader( reader );
            String line = null;
            
            // Leggo finchè ci sono dati da leggere
            while((line = br.readLine()) != null) {
                myJson.append( line );
            }
            
            // Ho finito, chiudo la connessione
            br.close();
            
            // Costruisco il JSON
            JSONObject json = new JSONObject( myJson.toString() );
            
            // Ci faccio quel che devo.
            // Ad esempio, stampo le previsioni per tutti i giorni:
            JSONObject jsonQuery = json.getJSONObject("query");
            JSONObject queryResults = jsonQuery.getJSONObject("results");
            JSONObject channel = queryResults.getJSONObject("channel");
            JSONObject resItem = channel.getJSONObject("item");
            JSONArray forecasts = resItem.getJSONArray("forecast");
            for(int i=0; i<forecasts.length(); i++) {
                JSONObject fc = forecasts.getJSONObject( i );
                
                System.out.println("Data: " + fc.getString("date"));
                System.out.println("Previsione: " + fc.getString("text"));
                System.out.println();
            }
        }

    Ciao.

    Ho visto ora il tuo messaggio... che dire... GRAZIE ("grazie volutamente con il MAIUSC)
    Un esempio vale più di mille guide e tutorial!!! L'ho provato, messo qua e la un po' di try-catch e funziona a meraviglia!
    Ora studio bene bene il tuo codice, che userò come punto di partenza per apprendere nuove cose.
    Grazie ancora! Il post lo posso definire RISOLTO

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.