Autore Topic: JSONObject Stampa  (Letto 314 volte)

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
JSONObject Stampa
« il: 10 Novembre 2016, 12:25:53 CET »
0
Salve ragazzi avrei un'altra domanda un po particolare questa volta...
ho questo JsonObject :

 try {
            this.messagge  = jsonObject.optString("messagge");
            this.title     = jsonObject.getString("title");
            this.text_news = jsonObject.getString("text_news");
            this.image     = jsonObject.getString("image");
            this.data      = jsonObject.getInt("data");
            this.iD        = jsonObject.getInt("id");
            this.pos       = jsonObject.getInt("pos");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
quindi come si può notare ho diverse "categorie"

ho un ArrayList che mi fa l'incremento :

 ArrayList<News> news = new ArrayList<News>();
                String stringaDalWS = buffer.toString();
                JSONObject aba      = new JSONObject(stringaDalWS);
                JSONArray prova     = aba.getJSONArray("news");

                for (int i = 0; i <prova.length() ; i++) {
                    News myNews = new News(prova.getJSONObject(i));
                    news.add(myNews);
La mia domanda è : se volessi stampare a video soltanto la "categoria! text_news di quel JSONObject in che modo lo posso fare?
Vi ringrazio in anticipo. :)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 265
  • Respect: +36
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSONObject Stampa
« Risposta #1 il: 10 Novembre 2016, 15:36:44 CET »
0
Presupponendo che la tua classe "News" abbia i metodi accessori get & set:

Nel tuo layout inserisci una view di tipo TextView -> Prendi il riferimento alla tua TextView -> Usi il suo metodo setText("testo"); per settargli il testo

Codice (Java): [Seleziona]
//La tua view
TextView mTextView = (TextView) findViewById(R.id.textView);
mTextView.setText(mNews.getText_news());

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:JSONObject Stampa
« Risposta #2 il: 10 Novembre 2016, 16:02:13 CET »
0
ma così facendo mi prendo tutte le Stringhe? a me serve soltanto un campo nel JSONObject

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:JSONObject Stampa
« Risposta #3 il: 10 Novembre 2016, 16:20:36 CET »
0
Ti consiglierei di seguire il suggerimento di LinkOut, ma se proprio vuoi caricare solo un campo, prova così
Codice (Java): [Seleziona]
String daStampare;
for (int i = 0; i <prova.length() ; i++) {
  daStampare = prova.getJSONObject(i).getString("text_news");
  //...
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:JSONObject Stampa
« Risposta #4 il: 10 Novembre 2016, 17:39:47 CET »
0
ok ohmni è giustissimo fare un ciclo for non ci avevo pensato e ti ringrazio, la mia domanda adesso resta come faccio a stampare tutte le "categorie" title contenute nel mio JSONObject?  usando ovviamente il tuo ciclo FOR... ?

io avevo pensato a qualcosa del genere...ma è totalmente sbagliata a quanto pare...
String dst = "";
                News l;
                for (int i = 0; i <prova.length() ; i++) {
                    l = (News) prova.get(i);
                    dst = dst + l.getTitle() + "\n";
« Ultima modifica: 10 Novembre 2016, 17:56:02 CET da Nikococo93 »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:JSONObject Stampa
« Risposta #5 il: 10 Novembre 2016, 22:07:57 CET »
0
Perché sbagliata? A me sembra che possa funzionare, anche se a dirla tutta dovresti spiegarmi cosa intendi per "stampare". Perché se vuoi farlo vedere a video, solitamente in android gli array si visualizzano con i listview.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:JSONObject Stampa
« Risposta #6 il: 11 Novembre 2016, 12:33:19 CET »
0
ti ringrazio ci sono riuscito...volevo proporti un nuovo quesito:
In pratica ho fatto il Parsing di un Json.. adesso il mio problema è: se questo JsonObject ha più classi mi spiego meglio ad esempio:

webradio : [ ....
id:
titolo:
ecc...

genre : [
id
icona
immagine
ecc...

come noterai questo json ha due classi principali webradio e genre...la mia domanda è come faccio a parsare anche l'altra classe Genre...poichè in questo momento parso soltanto webradio (la mia idea era di crearmi un Array nella classe Webradio ma in che modo posso farlo?) se non sono stato chiaro ti passo un esempio del mio codice:
public class WebRadio {
    int iD;
    String titolo,descrizione,img,flusso,radio_name,radio_logo,streaming;
    ArrayList<Genre> genre;

    public WebRadio(int iD) {
        this.iD = iD;
    }
   
    public WebRadio(JSONObject jsonObject){
        try {
            this.iD = jsonObject.optInt("id");
            this.titolo = jsonObject.optString("titolo");
            this.descrizione = jsonObject.optString("descrizione");
            this.img = jsonObject.optString("img");
            this.flusso = jsonObject.getString("flusso");
            this.radio_name = jsonObject.optString("radio_name");
            this.radio_logo = jsonObject.optString("radio_logo");
            this.streaming = jsonObject.optString("streaming");

        } catch ( JSONException e){
            e.printStackTrace();
        }
    }

    public WebRadio() {
        return;
    }
Questo nella classe WebRadio
poi ne ho un'altra identica soltanto che mi passa i valori contenuti in Genre...


la mia domanda è: come faccio a unire genre..che è un array contenuto in webradio a webradio stessa ? se non sono stato chiaro ti chiedo scusa...



Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:JSONObject Stampa
« Risposta #7 il: 11 Novembre 2016, 12:53:02 CET »
0
Prima di tutto USA il tag code quando scivi sul forum.
Poi USA Gson. È una libreria di google. In pratica di costruisci l'oggetto e metti tutti i campi con gli stessi nomi. Per esempio tale oggetto X avrà una lista di oggetti Radio dove l'oggetto ratio avrà i 3 campi con esattamente quei 3 nomi. E fai così per tutti i campi che ti servono. Se per esempio hai 23 campi ma utili sono solo 3 allora metti solo quei 3 nella classe X. Poi metti i getter che vuoi. Infine in una riga Gson ti mappa una stringa (la stringa json) nel tuo oggetto X tutto in autonomia. Figo vero?

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:JSONObject Stampa
« Risposta #8 il: 11 Novembre 2016, 12:59:03 CET »
0
mi scuso per i tag...e ti ringranzio tantissimo ora proverò :)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 265
  • Respect: +36
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSONObject Stampa
« Risposta #9 il: 11 Novembre 2016, 13:26:12 CET »
0
Segui quello che ti ha scritto l'utente di sopra.

Ti voglio proporre un esempio avanzato:

Librerie usate:
Codice (Java): [Seleziona]
    compile 'com.fasterxml.jackson.core:jackson-databind:2.5.1'
    compile 'com.fasterxml.jackson.core:jackson-core:2.5.1'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.1'

    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-jackson:2.0.2'
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.7.5'

Questo è il client che si occupa di fare le request HTTP:

Codice (Java): [Seleziona]
public enum Lib {

    INSTANCE;
    private final ILib restClient;
    private static final int CONNECTION_TIMEOUT = 10;
    private static final int READ_TIMEOUT = 30;
    private static final int WRITE_TIMEOUT = 30;

    private Lib() {
        restClient = new Retrofit.Builder()
                .baseUrl(BuildConfig.LIB_EP) //Questo è l'End Point!
                .addConverterFactory(JacksonConverterFactory.create())
                .client(new OkHttpClient.Builder()
                        .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
                        .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                        .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                        .build())
                .build()
                .create(ILib.class);
    }

    public ILib getRestClient() {
        return restClient;
    }

}

Il tutto "risponde" all'interfaccia (ILib) nella quale vengono definite tutte le richieste:

C'è un sempio di POST (dove viene passato un oggetto LUser come BODY ed un esempio di GET che ritorna una lista di Product passati in QUERY STRING gli id!
Codice (Java): [Seleziona]
public interface ILib {

   //La request risponde al seguente URL: BuildConfig.LIB_EP + "auth/business" es. www.google.com/auth/business
    @POST("auth/business")
    Call<Business> authUser (
            @Body LUser user
    );

    //La request risponde al seguente URL: BuildConfig.LIB_EP + "product" es. www.google.com/product?_id=id1,id2,id3
    @GET("product")
    Call<List<Product>> getProductsByList (
            @Query("_id") String prodIds
    );

}


Tutto questo si usa così:

Codice (Java): [Seleziona]
Lib.INSTANCE.getRestClient().authUser(mTestUser).enqueue(new Callback<Business>() { //mTestUser perchè vuole come body un oggetto come detto prima
                @Override
                public void onResponse(Call<Business> call, Response<Business> response) {
                   //Qui invece c'è la risposta delle tua request, e dentro response ci sarà appunto l'oggetto Business richiesto.
                  // Niente più JSONObject etc... perchè il client si occupa della serializzazione dei dati che riceve
                }

                @Override
                public void onFailure(Call<Business> call, Throwable t) {
                    //Cosa fai se la request fallisce? beh, definiscilo quì.
                }
            });

Questo è il modo secondo me più veloce e semplice di fare request HTTP via Android! Ovviamente non è facile da capire e ci sono tantissimi concetti... Le classe Business e Product sono semplici POJO quindi hanno semplicemente i metodi accessori get & set. Se vuoi passare gli oggetti ad altre activity, tali classe devono implementare Parcelable...

Ripeto, questo è un esempio grossolano di massima di quella che secondo me è la tecologia da adottare per questo tipo di situazioni, guardati bene le documentazioni delle librerie che ti ho scritto sopra, perchè una volta che impari il concetto fare client HTTP è semplice e diventa anche divertente, e tu dovrai solo più pensare alla parte grafica lasciando fare tutto il lavoro sporco di serializzazione al tuo "core"....

PS: L'esempio si basa su richieste REST con risposta JSON.
« Ultima modifica: 11 Novembre 2016, 13:32:00 CET da LinkOut »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:JSONObject Stampa
« Risposta #10 il: 11 Novembre 2016, 13:30:00 CET »
0
Personalmente io non condivido. Io solitamente una asynkhttp, che per fare un GET occupa 5 ricche di codice. E dentro la callback mappo l'oggetto con Gson. Quindi meno di 10 righe e funziona tutto perfettamente. Ovviamente ognuno ha le sue idee ;)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 265
  • Respect: +36
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSONObject Stampa
« Risposta #11 il: 11 Novembre 2016, 13:46:29 CET »
0
Ovviamente tonno, ognuno ha le sue idee... Io sono dell'idea che bisogna andare avanti e adottare nuove tecnologie... certo che è più veloce scrivere codice quando serve e voilà...

Per chiudere il post di sopra e la discussione a riguardo vi lascio questa guida: https://guides.codepath.com/android/Consuming-APIs-with-Retrofit

Saluti.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:JSONObject Stampa
« Risposta #12 il: 11 Novembre 2016, 15:16:28 CET »
0
vi ringrazio entrambi ma sto seguendo questa linea al momento...

Codice: [Seleziona]
  public WebRadio(JSONObject jsonObject){
        try {
            this.iD = jsonObject.optInt("id");
            this.titolo = jsonObject.optString("titolo");
            this.descrizione = jsonObject.optString("descrizione");
            this.img = jsonObject.optString("img");
            this.flusso = jsonObject.optString("flusso");
            this.radio_name = jsonObject.optString("radio_name");
            this.radio_logo = jsonObject.optString("radio_logo");
            this.streaming = jsonObject.optString("streaming");
            this.genre = new ArrayList<Genre>();
            for (int i = 0 ; i < jsonObject.optJSONArray() ; i++){{

il problema che non so cosa inserire nell'Array di preciso... avreste un'idea?
in pratica devo fare un Array di Genre contenuto in webradio
insomma un Array dentro un Array in parole povere...




Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:JSONObject Stampa
« Risposta #13 il: 11 Novembre 2016, 15:25:35 CET »
0

Prova così:

Codice (Java): [Seleziona]
//...
this.genre = new ArrayList<Genre>();
JSONArray genreArray = jsonObject.optJSONArray("genre");
for (int i = 0 ; i < genreArray.length() ; i++){
  this.genre.add(genre(genreArray.getJSONObject(i)));
}
//...

public Genre genre(JSONObject jsonObject) {
  //Questo lo scrivi tu :)
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Nikococo93

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei p8 lite
  • Sistema operativo:
    Android
Re:JSONObject Stampa
« Risposta #14 il: 11 Novembre 2016, 15:41:10 CET »
0
ti ringrazio per le tue immediate risposte, in pratica adesso quel metodo cosa dovrebbe in teoria restituirmi?
cioè io ho bisogno che mi vengano aggiunte a : WebRadio anche le sottocategorie di Genre quindi web radio ha i suoi array, e genre altrettanto...
credo sia la via giusta questa da te indicata, ma se gentilmente potresti indirizzarmi verso la soluzione perchè sto impazzendo letteralmente hahhaha