Autore Topic: JSON Serializer  (Letto 608 volte)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
JSON Serializer
« il: 28 Luglio 2014, 16:38:29 CEST »
0
Ci sono tanti serializzatori in giro per la rete, i miei due preferiti sono GSON e Jackson.

Il mio dubbio è il seguente: E' possibile mappare una stringa (JSON), in oggetto, senza sapere alcuni dei suoi campi?

Mi spiego meglio...
Il serializzatore trasforma una stringa json (per esempio) in un oggetto che lo sviluppatore definisce e poi utilizza tramite il suo Model.
Se non si conosce il tipo di oggetto che vi è presente nella stringa(JSON), come si fa a mapparlo su di un oggetto??

Vedo di fare un piccolo esempio..

Voglio creare un oggetto che si chiama macchina
quindi macchina avrà degli attributi per esempio colore, modello etc...
Se macchina avesse anche un attributo di tipo: Anno Produzione... e non si sa se l'anno arriverà in formato Stringa oppure Data, come si fa a mapparlo ugualmente? E' possibile?

Grazie.
« Ultima modifica: 29 Luglio 2014, 11:42:45 CEST da LinkOut »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:JSON Serializer
« Risposta #1 il: 28 Luglio 2014, 16:59:25 CEST »
0
Domanda più che legittima la tua. La risposta veloce è che devi conoscere la struttura del tuo JSON, se vuoi leggerlo.

La risposta lunga (che però conosco solo superficialmente) è che associato a ciascun JSON ci dovrebbe essere anche un JSON-SCHEMA, che è a sua volta un JSON e che descrive in tutto e per tutto il formato del JSON che accompagna. Viene solitamente usato per "validarne" il formato, per cui a maggior ragione risponderebbe al tuo quesito.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSON Serializer
« Risposta #2 il: 28 Luglio 2014, 17:08:09 CEST »
0
Si deve dunque sapere la struttura di arrivo del json...
Però, anche se si sà... (Quindi io so che la mia Data dell'esempio di prima può essere una Stringa oppure un oggetto Data) come faccio a mapparlo usando un serializzatore?

Post unito: 28 Luglio 2014, 17:35:37 CEST
Teoricamente la risposta è: Devi serializzare una classe contenente tipi polimorfici, ovvero che possono assumere valori e/o oggetti differenti...

Qualcuno ne ha mai senti parlare? L'ha mai usato? Che sa darmi qualche dritta? :)

(Se no continuerò su Google)

Grazie mille.
« Ultima modifica: 28 Luglio 2014, 17:35:37 CEST da LinkOut, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:JSON Serializer
« Risposta #3 il: 28 Luglio 2014, 18:09:36 CEST »
0
Si deve dunque sapere la struttura di arrivo del json...
Però, anche se si sà... (Quindi io so che la mia Data dell'esempio di prima può essere una Stringa oppure un oggetto Data) come faccio a mapparlo usando un serializzatore?

Non ho capito la domanda. Il formato del file json è semplice ascii per cui non a quel livello non esiste nessun problema di mappatura. Semmai dipende dal serializzatore che ha "generato" il json, nel caso abbia usato un formato piuttosto che un altro. E qui torniamo a prima: devi sapere non solo la struttura della stringa json, ma anche cosa contiene e in quale formato (es: la data è un timestamp oppure ggmmaaaa?).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSON Serializer
« Risposta #4 il: 29 Luglio 2014, 08:30:12 CEST »
0
Il problema è nel mappare un oggetto del json che può assumere diverse "forme" ... Quindi può essere una Stringa, una Data etc... (per esempio)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:JSON Serializer
« Risposta #5 il: 29 Luglio 2014, 09:00:00 CEST »
0
Il problema è nel mappare un oggetto del json che può assumere diverse "forme" ... Quindi può essere una Stringa, una Data etc... (per esempio)

Puoi fare esempi pratici di questi JSON con diverse forme assunte dall'oggetto?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSON Serializer
« Risposta #6 il: 29 Luglio 2014, 09:22:39 CEST »
0
Si certo.
Presupponiamo di avere un Garage...
Codice (Java): [Seleziona]
public class Garage {
   
    private Car [] Cars;
}
Il nostro garage è un insieme di macchine...
Vediamo come è composto l'oggetto Car.
Codice (Java): [Seleziona]
public class Car {

    private String typology;
    private Object value;

    public String getTypology() {
        return typology;
    }

    public void setTypology(String typology) {
        this.typology = typology;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

Quindi, il "Value" di car può essere qualunque cosa, da una stringa ad una data, ad un oggetto più complesso ancora.
Non si sà il  contenuto di "Value", lo si può dedurre dalla stringa typology.
Quindi se "typology":"string" <- Ciò vuol dire che Value è una stringa (Non so può essere la casa produttrice)
Se typology invece è formato così: "typology":"int" <- Magari è presente all'interno di Value il numero dei cavalli della macchina...

e cosi via..

Typology, puo' anche definire oggetti più complessi... che si comportano nello stesso modo..

Il problema è serializzare in modo corretto l'oggetto Value (Qui definito come Object), conoscendo un "Type"

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:JSON Serializer
« Risposta #7 il: 29 Luglio 2014, 09:53:28 CEST »
0
Se il campo può essere di vari tipi, secondo me devi serializzare sia il campo (in forma stringa) che il suo tipo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSON Serializer
« Risposta #8 il: 29 Luglio 2014, 11:18:23 CEST »
0
Hmm può essere una soluzione...


La soluzione dovrebbe essere questa: Jackson 1.5: Polymorphic Type Handling, first steps

Ma devo ancora capire come fare, grazie per il tempo dedicato.

Offline Nicola_D

  • 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:JSON Serializer
« Risposta #9 il: 29 Luglio 2014, 11:34:37 CEST »
0
io uso gson ultimamente che ti permette di definire serializer/deserializer specifici per ogni tipo di javaclass che vai a trovare durante le operazioni.
Nel mio caso avevo:
Codice (Java): [Seleziona]
public class WFSFeature{
    @Expose
    protected String type;
    @Expose
    protected String id;
    @Expose
    protected Geometry geometry;
......
}

public abstract class Geometry implements Parcelable {
 @Expose
    protected String type;
...
}
Poi ho 6 classi che estendono Geometry (LineString, MultiLineString,Point,MultiPoint,Polygon,Multipolygon),
per deserializzare quelle corrette ho:
Codice (Java): [Seleziona]
private static JsonDeserializer<Geometry> deserializer = new JsonDeserializer<Geometry>() {
        @Override
        public Geometry deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            Geometry geom = null;
            String type = json.getAsJsonObject().get("type").getAsString();
            if (WFSUtil.TYPE_POINT.equals(type)) {
               ...
            } else if (WFSUtil.TYPE_LINESTRING.equals(type)) {
               ...            
            } else if (WFSUtil.TYPE_POLYGON.equals(type)) {
                ...
            } else if (WFSUtil.TYPE_MULTIPOINT.equals(type)) {
                ...
            } else if (WFSUtil.TYPE_MULTILINESTRING.equals(type)) {
                ...
            } else if (WFSUtil.TYPE_MULTIPOLYGON.equals(type)) {
                ...
            }
            if (null != geom) {
                geom.setType(((Object) geom).getClass().getSimpleName());
            }
            return geom;
        }
    };

Non hai tante opzioni, le cose dinamiche da sole purtroppo non si fanno :D
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 LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:JSON Serializer
« Risposta #10 il: 29 Luglio 2014, 11:42:18 CEST »
0
Esatto, anche io stavo pensando un approccio simile usando però uno switch...
Mi sa che è l'unica soluzione ottimale per ora...

Grazie mille a tutti per il tempo e le risposte.

Buona giornata e buon lavoro...

Alex.