2013-12-11 18 views
9

Sono abbastanza nuovo per GSON e ottenere una risposta JSON di questo formato (solo un esempio più semplice, in modo che i valori non hanno senso):Come de-serializzare una mappa <String, Object> con GSON

{ 
    "Thomas": { 
     "age": 32, 
     "surname": "Scott" 
    }, 
    "Andy": { 
     "age": 25, 
     "surname": "Miller" 
    } 
} 

Voglio che GSON faccia una mappa, PersonData è ovviamente un oggetto. La stringa del nome è l'identificativo per PersonData.

Come ho detto Sono molto nuovo per GSON e provato solo qualcosa di simile:

Gson gson = new Gson(); 
Map<String, PersonData> decoded = gson.fromJson(jsonString, new TypeToken<Map<String, PersonData>>(){}.getType()); 

ma questo buttato l'errore:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 3141 

Ogni aiuto è apprezzato :)

+1

tuo JSON non è valido. Ho bisogno di una virgola prima di "Andy" – Taylor

+1

Mi dispiace, il JSON è sicuramente valido. Ho appena accorciato il JSON e l'ho dimenticato. Si tratta più della parte GSON su come interpretarla in base al valore-chiave in cui value è un oggetto che deve essere serializzato da GSON. – luuksen

risposta

23

Il lavori successivi per me

static class PersonData { 
    int age; 
    String surname; 
    public String toString() { 
     return "[age = " + age + ", surname = " + surname + "]"; 
    } 
} 

public static void main(String[] args) { 
    String json = "{\"Thomas\": {\"age\": 32,\"surname\": \"Scott\"},\"Andy\": {\"age\": 25,\"surname\": \"Miller\"}}"; 
    System.out.println(json); 
    Gson gson = new Gson(); 
    Map<String, PersonData> decoded = gson.fromJson(json, new TypeToken<Map<String, PersonData>>(){}.getType()); 
    System.out.println(decoded); 
} 

e stampe

{"Thomas": {"age": 32,"surname": "Scott"},"Andy": {"age": 25,"surname": "Miller"}} 
{Thomas=[age = 32, surname = Scott], Andy=[age = 25, surname = Miller]} 

Così forse la classe PersonData è molto diverso.

+0

Ok, ho avuto un altro problema e mi dispiace di aver infastidito il tuo tempo. Ho avuto un errore nei miei tipi di classe che non ho nemmeno pubblicato qui, ma la tua conferma che la parte di GSON funziona mi ha aiutato a capire dove guardare. Grazie! – luuksen

+0

@luuksen Prego. 'Gson' di solito è abbastanza buono nelle sue dichiarazioni di errore. 'BEGIN_ARRAY',' BEGIN_OBJECT', 'NUMBER' e' STRING' indicheranno cosa sta effettivamente leggendo il parser Gson invece di quanto ci si aspetta. –

1

È possibile utilizzare gson.toJsonTree(Object o) per convertire l'oggetto personalizzato in formato JSON.

le seguenti opere per me:

private static class PersonData { 
    private int age; 
    private String surname; 

    public PersonData(int age, String surname) { 
     this.age = age; 
     this.surname = surname; 
    } 
} 

public static void main(String[] args) { 
    PersonData first = new PersonData(24, "Yovkov"); 
    PersonData second = new PersonData(25, "Vitanov"); 

    Gson gson = new Gson(); 

    JsonObject jsonObject = new JsonObject(); 
    jsonObject.add("kocko", gson.toJsonTree(first)); 
    jsonObject.add("deyan", gson.toJsonTree(second)); 

    System.out.println(gson.toJson(jsonObject)); 

} 

e stampa:

{"kocko":{"age":24,"surname":"Yovkov"},"deyan":{"age":25,"surname":"Vitanov"}} 
+1

La stessa risposta di sopra, ma un po 'più tardi, grazie anche a voi! – luuksen

Problemi correlati