2017-05-30 1 views
0

Setup: - Android - Rénovation 2 - GsonComment la carte JSON dictionnaire automatiquement gson

Mon serveur JSON ressemble à ceci:

{ 
"myList1": 
    { 
    "1": (<- variable number) 
    { 
     "id":"1","name":"user123" 
    }, 
    "2"{},...}, 
"myList2": 
    { 
    "299": (<- variable number) 
    { 
    "id":"20","name":"user42" 
    }, 
    "300": 
    {},...} 
} 

Le premier noeud: "maliste1" et " myList2 "est corrigé.

Ensuite, le deuxième noeud contient un nombre variable

et le second noeud holdes un objet utilisateur.

-> Comment définir la réponse pour la deuxième liste avec gson?

-> Le nombre et le nombre des entrées est variable de

Ma cartographie de réponse ressemble à:

public class ResponeDef { 
    @Gson.Named("myList1") 
    ResponeListDef list1; 

    @Gson.Named("myList2") 
    ResponeListDef list1; 
} 

public class ResponeListDef { 
    @Gson.Named("??") 
    ResponeListEntryDef entry1 

    @Gson.Named("??") 
    ResponeListEntryDef entry2; 
} 

public class ResponeListEntryDef { 
    @Gson.Named("id") 
    int id; 

    @Gson.Named("name") 
    String userName; 
} 
+0

cela peut aider à: https : //stackoverflow.com/questions/16891243/parse-json-with-variable-key –

Répondre

1

Si vous avez le contrôle sur l'API, la solution la plus simple serait de convertir la réponse format à

{ 
"myList1": 
    [ 
    { 
     "id":"1","name":"user123" 
    }, 
    {},...], 
"myList2": 
    [ 
    { 
    "id":"20","name":"user42" 
    }, 
    {},...] 
} 

Si ce n'est pas le cas, vous pouvez l'analyser en utilisant un TypeAdapter personnalisé.

Changer votre réponse def à

public class ResponeDef { 
    @Gson.Named("myList1") 
    List<ResponseListEntryDef> list1; 

    @Gson.Named("myList2") 
    List<ResponseListEntryDef> list1; 
} 

public class ResponeListEntryDef { 
    @Gson.Named("id") 
    int id; 

    @Gson.Named("name") 
    String userName; 
} 

et créer un TypeAdapter personnalisé comme

class CustomAdapter extends TypeAdapter<ResponseDef> { 

    @Override 
    public void write(JsonWriter out, ResponseDef value) throws IOException { 
     // loop over lists and write them to out 
    } 

    @Override 
    public ResponseDef read(JsonReader in) throws IOException { 
     // loop over items in jsonReader and initialize the lists 
     return responseDef; 
    } 
} 

Vous pouvez ensuite enregistrer l'adaptateur de type avec Gson avec

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(ResponseDef.class, new CustomAdapter()) 
       .create();