Autore Topic: [facile]Parsing JSON con GSON  (Letto 4429 volte)

Offline TheTodd

  • Utente junior
  • **
  • Post: 58
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    samsung gs2
  • Play Store ID:
    sdmdev
  • Sistema operativo:
    window xp
[facile]Parsing JSON con GSON
« il: 01 Febbraio 2013, 11:59:03 CET »
+1
Livello di difficoltà : facile
Min SDK : 4
Sorgente : ZIP allegato


fonti :

Download :


Introduzione :
Questo tutorial mostra come parsare un file JSON con la libreria GSON.
JSON è un formato utilizzato per lo scambio dati in applicazioni client-server. Spesso lo si preferisce rispetto ad XML per la sua leggerezza ed in combinazione API REST viene passato nel campo risposta.
Gson è una libreria java che può essere usata per convertire un oggetto Java nella loro rappresentazione JSON e viceversa e ne semplifica il parsing.

Contenuto del tutorial :

Per prima cosa, copiare il jar GSON nella cartella libs del progetto
e concedere il permesso INTERNET aggiungendo al manifest questa riga:
Codice (XML): [Seleziona]
<uses-permission android:name="android.permission.INTERNET"/>Come file json ho utilizzato la risposta ad una API twitter (search) . Per rendere il json maggiormente leggibile ho utilizzato questo plugin http://sourceforge.net/projects/eclipsejsonedit/

Passiamo al codice, le prossime 3 classi sono utilizzate per i dati dell'applicazione :
da notare c'è solo l'utilizzo dell'Annotation @SerializedName che dice che il campo deve essere utilizzato con il suo nome JSON

Codice (Java): [Seleziona]
package com.sdmdev.android.jsonparsingtutorial.model.twittersearch;

import java.util.List;
import com.google.gson.annotations.SerializedName;

public class SearchResponse {

        public List<Result> results;

        @SerializedName("max_id")
        public long maxId;

        @SerializedName("since_id")
        public int sinceId;

        @SerializedName("refresh_url")
        public String refreshUrl;

        @SerializedName("next_page")
        public String nextPage;

        @SerializedName("results_per_page")
        public int resultsPerPage;

        public int page;

        @SerializedName("completed_in")
        public double completedIn;

        @SerializedName("since_id_str")
        public String sinceIdStr;

        @SerializedName("max_id_str")
        public String maxIdStr;

        public String query;

}

Questa è la classe Result.java (bean contenuto in ResponseSearch.java)

Codice (Java): [Seleziona]
public class Result {

        @SerializedName("from_user_id_str")
        public String fromUserIdStr;

        @SerializedName("profile_image_url")
        public String profileImageUrl;

        @SerializedName("created_at")
        public String createdAt;

        @SerializedName("from_user")
        public String fromUser;

        @SerializedName("id_str")
        public String idStr;

        public Metadata metadata;

        @SerializedName("to_user_id")
        public String toUserId;

        public String text;

        public long id;

        @SerializedName("from_user_id")
        public String from_user_id;

        @SerializedName("iso_language_code")
        public String isoLanguageCode;

        @SerializedName("to_user_id_str")
        public String toUserIdStr;

        public String source;

}

Classe Metadata.java

Codice (Java): [Seleziona]
public class Metadata {
       
        @SerializedName("result_type")
        public String resultType;

}

Questa è l'activity, utilizza un asynctask per (per velocità ho cablato nel codice la stringa di connessione e recuperato solo qualche valore):

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        public static final String TAG = null;
        String urlTwitter = "[url]http://search.twitter.com/search.json?q=sdmdev";

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                new JsonTask().execute();

        }


        private class JsonTask extends AsyncTask<Void, Void, Void> {
                String responseStr = null;

                @Override
                protected Void doInBackground(Void... params) {

                        InputStream source = Utils.retrieveStream(urlTwitter);
                        Gson gson = new Gson();

                        Reader reader = new InputStreamReader(source);

                        SearchResponse response = gson.fromJson(reader,
                                        SearchResponse.class);

                        Log.v(TAG, "" + response.maxId + " " + response.page + " "
                                        + response.query);
                        responseStr = new String("maxId: " + response.maxId + "\npage: "
                                        + response.page + "\nquery: " + response.query);

                        return null;
                }

                @Override
                protected void onPostExecute(Void result) {
                        TextView tvResponse = (TextView) findViewById(R.id.tvResponse);
                        tvResponse.setText(responseStr);
                        super.onPostExecute(result);
                }

        }

l'output è allegato.
Grazie
« Ultima modifica: 01 Febbraio 2013, 14:08:34 CET da TheTodd »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile]Parsing JSON con GSON
« Risposta #1 il: 01 Febbraio 2013, 13:37:27 CET »
+1
Grazie, molti utenti troveranno utile questo tutorial :-)
Il jar di GSON però dovrebbe essere messo dentro la cartella "libs" e non nel build path.