2013-01-10 18 views
14

Ho un oggetto utente con questa struttura:deserializzazione un campo Map <String, Object> con GSON

class User { 
    private String id; 
    private String name; 
    private Map<String, Object> properties; 

    // GETTERS & SETTERS 
} 

ho una stringa JSON con questa struttura: chiavi

{ 
    "user": { 
     "id:"123456789", 
     "name:"azerty", 
     "emailHash":"123456789", // not used in User class 
     "properties": { 
      "p1":1, 
      "p2":"test", 
      "p3":[1, 2, 3, 4], 
      "p4":{ 
       etc... 
      } 
     } 
    } 
} 

proprieta sono String, i valori delle proprietà può essere una stringa, int, array, boolean, ecc Mappa

cerco di deserializzare questa stringa JSON con GSON così:

JsonParser parser = new JsonParser(); 
JsonElement element = parser.parse(jsonString); 
JsonObject object = element.getAsJsonObject(); 

GsonBuilder builder = new GsonBuilder(); 
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
Gson gson = builder.create(); 
User user = (User) gson.fromJson(object.get("user"), new TypeToken<User>() {}.getType()); 

I campi "id" e "nome" sono immessi correttamente ma il campo "proprietà" rimane nullo.

Sai cosa sto facendo male? Grazie in anticipo per il vostro aiuto!

+0

vi suggerisco di avere proprietà come 'JsonObject' e poi convertire il JSON direttamente a' Map '. – Srinivas

+0

Il tuo codice funziona perfettamente con un piccolo problema: sembra che tu abbia creato un 'GsonBuilder' chiamato' builder', ma poi ne usi uno chiamato 'gsonBuilder'. Se questo è in realtà compilazione, hai un altro 'GsonBuilder' che hai creato in precedenza e lo stai usando per errore. A parte questo ... deserializza bene sulla mia macchina. –

+0

'gsonBuilder' è un errore quando scrivo l'argomento. È 'builder' che uso nel mio codice. Modificherò il mio argomento per la correzione. Il campo 'properties' è correttamente iniettato nel tuo test? È molto strano rimanere per nulla per me ... –

risposta

9

Per me questo codice:

public class Main { 
    public static void main(String[] args) throws IOException { 
    GsonBuilder builder = new GsonBuilder(); 
    builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
    Gson gson = builder.create(); 
    FileInputStream inputStream = new FileInputStream(new File("bobi.json")); 
    InputStreamReader reader = new InputStreamReader(inputStream); 
    User user = gson.fromJson(reader, User.class); 
    System.out.println(user.getName()); 
    System.out.println(user.getId()); 
    for (String property : user.getProperties().keySet()) { 
     System.out.println("Key: " + property + " value: " + user.getProperties().get(property)); 
    } 
    reader.close(); 
} 

Stampe questo:

azerty 
123456789 
Key: p1 value: 1.0 
Key: p2 value: test 
Key: p3 value: [1.0, 2.0, 3.0, 4.0] 
Key: p4 value: {} 

Tuttavia, tenere a mente che ho messo a nudo l'oggetto JSON avvolgimento nel file di analisi. Il file è:

{ 
     "id":"123456789", 
     "name" : "azerty", 
     "emailHash":"123456789", 
     "properties": { 
      "p1":1, 
      "p2":"test", 
      "p3":[1, 2, 3, 4], 
      "p4":{ 

      } 
     } 
} 

Inoltre ho aggiunto chiusura virgolette per name e id, che non hai avuto nel campione.

La classe User come richiesto dall'OP. Ho aggiunto getter e setter per la ragione della stampa:

import java.util.Map; 

class User { 
    private String id; 
    private String name; 
    private Map<String, Object> properties; 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Map<String, Object> getProperties() { 
     return properties; 
    } 
    public void setProperties(Map<String, Object> properties) { 
     this.properties = properties; 
    } 
} 
+0

Potresti postare l'oggetto 'utente' che hai usato? Provo il tuo codice ma 'properties' è sempre' null' ... Sono su JDK7 e Gson 2.2.2 se posso aiutare ... –

+0

@FranckYapadesouciAnso: Aggiunto. Gson 2.1, java 1.7 –

+0

Ok ho trovato il mio errore. Era il problema FieldNamingPolicy. Grazie per l'aiuto. Buona giornata! –

Problemi correlati