Autore Topic: lettura file json complesso  (Letto 1498 volte)

Offline roby8517

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
lettura file json complesso
« il: 18 Agosto 2011, 16:36:51 CEST »
0
salve,
sto tentando di leggere un file json un po complesso per le mie capacità per questo vi chiedo il vostro aiuto
il file json completo si trova qui http://api.mixcloud.com/radiocicletta/cloudcasts/[/url]

ecco qui una parte
Codice (XML): [Seleziona]
{
    "paging": {
        "previous": "[url]http://api.mixcloud.com/radiocicletta/cloudcasts/?since=2011-07-31+10%3A29%3A15&limit=20"
   },
   "data": [
       {
           "listener_count": 0,
           "name": "Gli Spacciaserie - La SpacciaRocca, puntata tarocca de GliSpacciaserie",
           "tags": [
               {
                   "url": "http://www.mixcloud.com/tag/radiocicletta/",
                   "name": "Radiocicletta",
                   "key": "/tag/radiocicletta/"
               },
               {
                   "url": "http://www.mixcloud.com/tag/gli-spacciaserie/",
                   "name": "Gli Spacciaserie",
                   "key": "/tag/gli-spacciaserie/"
               }
           ],
           "url": "http://www.mixcloud.com/radiocicletta/gli-spacciaserie-la-spacciarocca-puntata-tarocca-de-glispacciaserie/",
           "pictures": {
               "medium": "http://thumb2.mixcloud.com/w/150/h/150/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
               "extra_large": "http://thumb2.mixcloud.com/w/600/h/600/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
               "large": "http://thumb2.mixcloud.com/w/300/h/300/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
               "medium_mobile": "http://thumb2.mixcloud.com/w/80/h/80/q/75/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
               "small": "http://thumb2.mixcloud.com/w/25/h/25/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
               "thumbnail": "http://thumb2.mixcloud.com/w/50/h/50/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524"
           },
           "updated_time": "2011-08-08T21:58:22Z",
           "play_count": 2,
           "comment_count": 0,
           "percentage_music": 14,
           "user": {
               "url": "http://www.mixcloud.com/radiocicletta/",
               "username": "radiocicletta",
               "name": "radiocicletta",
               "key": "/radiocicletta/",
               "pictures": {
                   "medium": "http://thumb2.mixcloud.com/w/150/h/150/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
                   "extra_large": "http://thumb2.mixcloud.com/w/600/h/600/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
                   "large": "http://thumb2.mixcloud.com/w/300/h/300/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
                   "medium_mobile": "http://thumb2.mixcloud.com/w/80/h/80/q/75/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
                   "small": "http://thumb2.mixcloud.com/w/25/h/25/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524",
                   "thumbnail": "http://thumb2.mixcloud.com/w/50/h/50/q/85/upload/images/profile/6881a983-9e67-434b-859b-d06a5ab07524"
               }
           },
           "key": "/radiocicletta/gli-spacciaserie-la-spacciarocca-puntata-tarocca-de-glispacciaserie/",
           "created_time": "2011-07-31T10:29:15Z",
           "audio_length": 2242,
           "slug": "gli-spacciaserie-la-spacciarocca-puntata-tarocca-de-glispacciaserie",
           "favorite_count": 0
       },.........

il mio problema consiste nel fatto che nn riesco a estrarre i dati della pictures qualcuno mi da una mano

Codice (Java): [Seleziona]
package play.radiocicletta;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import play.radiocicletta.activitypodcast.Data.pictures;

import android.app.Activity;
import android.graphics.Picture;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class activitypodcast extends Activity {
    /** Called when the activity is first created. */
        private ListView lv;
        ArrayList<String> listview_mixcloud = new ArrayList<String> ();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_podcast);
       
        String url = "http://api.mixcloud.com/radiocicletta/cloudcasts/";
           
            String name = null;
            String key= null;
            Data data=null;
            String thumbnail=null;
            ArrayList<Data> dataArray = new ArrayList<Data>();

            String source = retrieveStream(url);
            try {
                if(source !=null){
                        JSONObject jo = new JSONObject(source);
                        JSONArray ja = new JSONArray(jo.getString("data"));
                        for (int i = 0; i < ja.length(); i++) {
                                JSONObject row = ja.getJSONObject(i);
                               
                                name = row.getString("name");
                                key = row.getString("key");
                                thumbnail=row.getString("thumbnail");
                                data = new Data();
                               
                                data.setNome(name);
                                data.setKey(key);
                                ((pictures) data.pictures).setThumbnail(thumbnail);
                                dataArray.add(data);
                               
                       
                        }
       
                }else{
                         Toast.makeText(activitypodcast.this, "NN sei connesso a internet", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                    // TODO Auto-generated catch block
                Log.e("log_tag", "Error json " + e.toString());
                }
            Date pod = new Date();
            pod.setApplicazione(dataArray);
       
            for(int i=0;i< pod.Data.size();i++){
               
                String mkl= pod.Data.get(i).getNome();
                listview_mixcloud.add(mkl);
            }
           

        lv = (ListView) findViewById(R.id.listviewPod);
        lv.setAdapter(new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1, listview_mixcloud));
        lv.setTextFilterEnabled(true);
       
        lv.setOnItemClickListener(new ListView.OnItemClickListener()
                {
                public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
                        {
                       
               
                               
                        }
                });
           
       
    }
   
   
    private String retrieveStream(String url) {

                        DefaultHttpClient client = new DefaultHttpClient();

                        HttpGet getRequest = new HttpGet(url);

                        try {

                                HttpResponse getResponse = client.execute(getRequest);
                                final int statusCode = getResponse.getStatusLine().getStatusCode();

                                if (statusCode != HttpStatus.SC_OK) {
                                        Log.w(getClass().getSimpleName(), "Error " + statusCode + " for URL " + url);
                                        return null;
                                }

                                HttpEntity getResponseEntity = getResponse.getEntity();

                                // convert response to string
                                try {
                                        BufferedReader reader = new BufferedReader(new InputStreamReader(getResponseEntity.getContent(), "iso-8859-1"), 8);
                                        StringBuilder sb = new StringBuilder();
                                        String line = null;
                                        while ((line = reader.readLine()) != null) {
                                                sb.append(line + "\n");
                                        }

                                        return sb.toString();
                                } catch (Exception e) {
                                        Log.e("log_tag", "Error converting result " + e.toString());
                                }

                        } catch (IOException e) {
                                getRequest.abort();
                                Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
                        }

                        return null;

                }
    public class Data {
       
        public Object pictures;
                String name;
       
        public class pictures{
                String medium;
                String extra_large;
                String large;
                String medium_mobile;
                String small;
                String thumbnail;
               
                public pictures() {
                        super();
                }
                public String getThumbnail(String thumbnail){
                        return thumbnail;
                }
                public void setThumbnail(String thumbnail){
                        this.thumbnail= thumbnail;
                }
               
        }
       
        String key;
        String Image;
       
        public Data() {
                super();
        }

       
        // NOME
        public String getNome() {
                return name;
        }
        public void setNome(String name) {
            this.name = name;
        }
        //key
        public String getKey(){
                return key;
        }
        public void setKey(String key){
                this.key = key;
        }
       
       
       

    }  
    //La classe programmi per gestire la struttura interna:
    public class Date {
        public Date() {
                super();
        }

        ArrayList<Data> Data;

        public ArrayList<Data> getData() {
                return Data;
        }

        public void setApplicazione(ArrayList<Data> Data) {
                this.Data = Data;
        }
    }
}
   

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:lettura file json complesso
« Risposta #1 il: 18 Agosto 2011, 16:57:23 CEST »
0
thumbnail non è diretto figlio di "data" ma è figlio di "pictures" che sta in data.
Dei prendere il JSONObject "pictures" e poi da quello puoi prendere il "thumbnail"
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline roby8517

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
Re:lettura file json complesso
« Risposta #2 il: 20 Agosto 2011, 13:18:25 CEST »
0
grazie per la risp, volevo chiederti se puoi essere più preciso io ho provato a fare cosi ma nn mi funziona

Codice (Java): [Seleziona]
JSONObject jo = new JSONObject(source);
                        JSONArray ja = new JSONArray(jo.getString("data"));
                        for (int i = 0; i < ja.length(); i++) {
                                JSONObject row = ja.getJSONObject(i);
                               
                                name = row.getString("name");
                                key = row.getString("key");
                                JSONObject jp = new JSONObject("pictures");
                                        JSONArray je = new JSONArray(jp.getString("pictures"));
                                        JSONObject row2 = je.getJSONObject(5);
                                thumbnail=row2.getString("thumbnail");
                                data = new Data();
                               
                                data.setNome(name);
                                data.setKey(key);
                                ((pictures) data.pictures).setThumbnail(thumbnail);
                                dataArray.add(data);
                               
                       
                        }
       

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:lettura file json complesso
« Risposta #3 il: 21 Agosto 2011, 11:29:43 CEST »
0
Il tuo JSON contiene 3 riferimenti che sono "paging" il quale è un oggetto JSON, "data" che è un oggetto JSONArray e "name" che è una stringa.
Ora, quando tu instanzi il JSONArray in realtà sati creando un nuovo JSONArray che ha al suo interno un unico valore preso dalla funzione : jo.getString("data"), la quale ritorna una stringa, cioè il valore contenuto in "data", il quale è un array. In pratica a naso direi che ottieni un array di array.  :-[
Invece che creare un nuovo JSONArray, potresti prenderlo dal tuo JSONObject :
Codice (Java): [Seleziona]
JSONArray ja = jo.getJSONArray("data");
Stesso discorso per :
Codice (Java): [Seleziona]
JSONObject jp = new JSONObject("pictures");Qui stai creando un nuovo oggetto JSON con nome/valore "pictures", invece devi prendere il riferimento di "pictures" contenuto in ogni oggetto JSON, contenuti a loro volta nel JSONArray.

Codice (Javascript): [Seleziona]
data:[{pictures:{...}},{pictures:{...}}...ecc]
Il ciclo for è corretto, ora ti basta prendere il riferimento all'oggetto "pictures" contenuto in ogni "row"  ;-)

Leggi bene la documentazione : -> JSONObject | Android Dev