在Java中处理REST结果(json)中的不一致数据类型

我是新手,并试图在Android Studio的setlist.fm上使用Rest API,但是在将我的GET请求结果放入我的Java数据模型时遇到了一些问题。 特别是,我将“集合”(“集合”是指在​​音乐会上演奏的集合)建模为Java类。 但通常情况下,我从我的HTTP请求中得到结果,这些请求已“设置”为空字符串甚至数组。

我将使用以下所有Radiohead设置列表的GET请求作为示例: http : //api.setlist.fm/rest/0.1/artist/a74b1b7f-71a5-4011-9441-d0b5e4122711/setlists.json

请注意,在大多数情况下,“集合”是一个对象。 但在某些情况下,它是一个字符串 。 在其他情况下,它是一个数组

当我尝试使用以下代码行将gson解析为我的数据模型时,我的Android Studio给出了以下错误:

gson.fromJson(result.toString(),Response.class); 

它似乎在一个实例上失败,其中“sets”显示为空字符串而不是对象:

 Expected BEGIN_OBJECT but was STRING at line 1 column 942 path $.setlists.setlist[0].sets 

有没有人有关于如何处理这类事情的建议? 我已经注意到了迄今为​​止我所看过的所有艺术家。 谢谢!

假设Response是你编写的一个包含json主要字段的类,并且在它的某个点上你有:

 @SerializedName("setlist") private List setlist; 

我还假设您的MyItem类包含以下字段:

 @SerializedName("sets") private List sets; 

如果你让Gson解析它,它会在找到一个字符串而不是MySet对象的列表( – >数组)时失败。

但是您可以为MyItem 编写自定义的TypeAdapter

有很多关于如何编写Gson TypeAdapter的文档,请查找它。

使用instanceOf运算符来确定类型并进行相应的转换。

 JSONObject response=new JSONObject(res); if(res.get("key") instanceOf JSONObject) { // code for JSONObject } else if(res.get("key") instanceOf JSONArray) { // code for JSONOArray } And so on