CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: gianpassa con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 10 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 3 su 3
Discussione:

[GSON] deserializzare uno stream JSON all'interno di un oggetto istanziato

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Feb 2011
    Messaggi
    19

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    [GSON] deserializzare uno stream JSON all'interno di un oggetto istanziato

    Salve a tutti,
    ho iniziato da poco ad utilizzare la libreria gson di google per serializzare e deserializzare uno stream JSON. Avrei l'esigenza di deserializzare uno stream JSON all'interno di un oggetto già istanziato.

    creo un semplice esempio per capire meglio cosa intendo

    Di seguito l'oggetto che contiene i dati dell'utente. L'oggetto seguente contiene solamente l'IDUtente, il resto dei dati dovranno essere popolati a seguito di una richiesta http. Il risultato JSON della richiesta dovrà essere deserializzato all'interno dell'oggetto User già istanziato.

    codice:
    public class User implements Serializable{
    
    	private int IDUser;
    	private String Name;
    	private String Surname;
    	
    	public String getIDUser() {
    		return IDUser;
    	}
    	
    	public void setIDUser(String iduser) {
    		this.IDUser= IDUser;
    	}
    
    	public String getName() {
    		return Name;
    	}
    	
    	public void setName(String name) {
    		this.Name= Name;
    	}
    
    	public String getSurname() {
    		return Surname;
    	}
    	
    	public void setSurname(String surname) {
    		this.Surname= Surname;
    	}
    			
    }

    All'interno di questo metodo istanzio l'oggetto User, setto l'ID e invio la richiesta HTTP

    codice:
    	public void JSONProjectDes(){
    		
    		User user = new User();
    		user.setIDUser(34);
    		
    		System.out.println("IDUser: "+user.getIDUser());
    		System.out.println("Name: "+user.getName());
    		System.out.println("Surname: "+user.getSurname());
    		
    		Gson gson = new Gson();
    		String userJson = gson.toJson(user);
    
                    // ...
                    // per semplificare la lettura ho eliminato la parte che effettua la richiesta http
    
                    // a questo punto invio la richiesta HTTP con il seguente JSON "{\"IDUser\" : 34}"
    		System.out.println(userJson);
    		System.out.println("");
    		System.out.println("");
    		
                    // dalla richiesta http ricevo il seguente JSON che do in pasto alla libreria gson per effettuare la deserializzazione sullo stesso oggetto user già istanziato
    		String reader = "{\"Name\" : \"Mario\", \"Surname\" : \"Rossi\",}";
    		
    		user= gson.fromJson(reader, User.class);
    
    		System.out.println("IDUser: "+user.getIDUser());
    		System.out.println("Name: "+user.getName());
    		System.out.println("Surname: "+user.getSurname());
    		
    	}
    Come già accennato su un commento, lo stream JSON ottenuto dalla richiesta HTTP vorrei deserializzarlo all'interno dello stesso oggetto user già istanziato. In questo modo vado a popolare la parte mancante delle variabili dell'oggetto. Purtroppo, deserializzando con gson.fromJson(reader, User.class);, gson popola le variabili Name e Surname ma setta a null la variabile IDUser. Questo perchè l'oggetto precedentemente istanziato, presumo venga distrutto e ricreato da gson nel momento in cui effettuo gson.fromJson(reader, User.class);.
    La domanda a questo punto è, è possibile deserializzare con gson uno stream JSON all'interno di un oggetto già esistente?

    grazie mille

  2.  
  3. #2
    Baby Droid


    Registrato dal
    Jun 2011
    Messaggi
    5

    Ringraziamenti
    0
    Ringraziato 1 volta in 1 Post
    Predefinito

    Io seguirei un'altra strada: invece di in stanziare l' oggetto e poi deserializzarlo in oggetto Jason, mandi una richiesta rest come per esempio ... ...../user/userid . La chiamata rest restituisce la rappresentazione Json di user con tutti i dati necessari e poi deserializzi. Devi modificare la risposta test in modo che comtenga anche l id.

    Inviato da GT 9000 Cynomogen 10.1 con Tapatalk 2

  4. #3
    Baby Droid


    Registrato dal
    Feb 2011
    Messaggi
    19

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da pspics Visualizza il messaggio
    Io seguirei un'altra strada: invece di in stanziare l' oggetto e poi deserializzarlo in oggetto Jason, mandi una richiesta rest come per esempio ... ...../user/userid . La chiamata rest restituisce la rappresentazione Json di user con tutti i dati necessari e poi deserializzi. Devi modificare la risposta test in modo che comtenga anche l id.

    Inviato da GT 9000 Cynomogen 10.1 con Tapatalk 2
    ciao pspics, grazie mille per il tuo aiuto ;-)... quello che ho postato era solo un esempio, il mio obiettivo e' quello di deserializzare all'interno di un oggetto già istanziato che contiene dei dati...
    Ho girato in rete e, tra le specifiche gson, viene indicato che non e' possibile deserializzare uno stream Json aggiornando un oggetto già istanziato... Cosi pensandoci bene sono arrivato ad una soluzione un po' sporca ma efficace per quello che serve a me... La posto così può tornare utile anche ad altri utenti...

    all'interno dell'oggetto contenitore creo un metodo, ad esempio updatedata, che si aspetta come parametro un oggetto di tipo User. tale metodo si preoccuperà di aggiornare le variabili ricevute dalla deserializzazione dello stream da parte di gson

    codice:
    public class User implements Serializable{
    
    	private int IDUser;
    	private String Name;
    	private String Surname;
    	
    	public String getIDUser() {
    		return IDUser;
    	}
    	
    	public void setIDUser(String iduser) {
    		this.IDUser= IDUser;
    	}
    
    	public String getName() {
    		return Name;
    	}
    	
    	public void setName(String name) {
    		this.Name= Name;
    	}
    
    	public String getSurname() {
    		return Surname;
    	}
    	
    	public void setSurname(String surname) {
    		this.Surname= Surname;
    	}
    
    	public void updateData(User Object) {
    		this.Name= Object.Name;
    		this.Surname= Object.Surname;
    	}
    			
    }
    Al momento della deserializzazione mi comporterò in questo modo

    codice:
    	public void JSONProjectDes(){
    		
    		User user = new User();
    		user.setIDUser(34);
    		
    		System.out.println("IDUser: "+user.getIDUser());
    		System.out.println("Name: "+user.getName());
    		System.out.println("Surname: "+user.getSurname());
    		
    		Gson gson = new Gson();
    		String userJson = gson.toJson(user);
    
                    // ...
                    // per semplificare la lettura ho eliminato la parte che effettua la richiesta http
    
                    // a questo punto invio la richiesta HTTP con il seguente JSON "{\"IDUser\" : 34}"
    		System.out.println(userJson);
    		System.out.println("");
    		System.out.println("");
    		
                    // dalla richiesta http ricevo il seguente JSON che do in pasto alla libreria gson per effettuare la deserializzazione sullo stesso oggetto user già istanziato
    		String reader = "{\"Name\" : \"Mario\", \"Surname\" : \"Rossi\",}";
    		
                    // in questo modo gson deserializza lo stream all'interno di un nuovo oggetto di tipo User, lo stesso oggetto lo passo per parametro al metodo updateData dell'oggetto User principale, che si preoccuperà di aggiornare le variabili.
    		user.updateData(gson.fromJson(reader, User.class));
    
    		System.out.println("IDUser: "+user.getIDUser());
    		System.out.println("Name: "+user.getName());
    		System.out.println("Surname: "+user.getSurname());
    		
    	}
    certo questo mi costringe a dover scrivere manualmente il codice che si preoccupa dell'aggiornamento delle variabili, ma pensandoci bene credo che sia più funzionale, perché si ha la possibilità di gestire eventuali condizioni

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy