2017-05-30 57 views
0

安裝程序會自動JSON詞典: - Android電子 - 改造2 - GSON如何映射與GSON

我的服務器JSON看起來是這樣的:

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

的第一個節點: 「myList1」 和「 myList2「已修復。

然後,第二節點包含可變數目的

和第二節點holdes一個用戶對象。

- >如何使用gson定義第二個列表的響應?

- >的數量和項目的數量是可變的

我的迴應的映射是這樣的:

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

這可能會幫助註冊GSON類型的適配器:HTTPS ://stackoverflow.com/questions/16891243/parse-json-with-variable-key –

回答

1

如果你有過API控制,最簡單的解決辦法是將響應轉換格式爲

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

如果你不這樣做,那麼你可以使用自定義的TypeAdapter來解析它。

更改您的回覆高清到

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; 
} 

,並創建一個自定義TypeAdapter作爲

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; 
    } 
} 

然後,您可以用

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