2017-05-30 55 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();