在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