我正在尝试在 Android 中使用 GSON 解析来自烂番茄 API 的 JSON 数据。我可以解析其中的一些内容,但我似乎在处理基本结果对象内部的数组时遇到了问题。
这是我的“MovieObject”类:
package ---;
import com.google.gson.annotations.SerializedName;
import java.util.List;
public class MovieObject {
public List<Rating> ratings; //You are a problem
@SerializedName("id")
public String id;
@SerializedName("title")
public String title;
@SerializedName("year")
public int year;
@SerializedName("mpaa_rating")
public String mpaaRating;
@SerializedName("runtime")
public int runtime;
@SerializedName("critics_consensus")
public String criticsConsensu;
@SerializedName("synopsis")
public String synopsis;
@SerializedName("studio")
public String studio;
}
我可以成功提取诸如title
之类的字段, id
和year
但无法访问我的评级类中的字段 ( public List<Rating> ratings
)
这是评级类别:
package ---
import com.google.gson.annotations.SerializedName;
public class Rating {
@SerializedName("critics_rating")
public String criticsRating;
@SerializedName("critics_score")
public int criticsScore;
@SerializedName("audience_rating")
public String audienceRating;
@SerializedName("audience_score")
public int audienceScore;
}
以下是我的 Activity 的一些摘录,涉及我如何尝试获取数据。在大多数情况下,这是有效的。
InputStream source = retrieveStream(url);
Gson gson = new Gson();
Reader reader = new InputStreamReader(source);
MovieObject mObject = gson.fromJson(reader, MovieObject.class); //Expected BEGIN_ARRAY but was BEGIN_OBJECT instead. Something to do with the Rating object I believe.
Toast.makeText(this, mObject.title, Toast.LENGTH_SHORT).show();
Toast.makeText(this, mObject.synopsis,Toast.LENGTH_SHORT).show();
当我尝试做这样的事情时,问题就出现了:
List<Rating> ratings = mObject.ratings;
for (Rating rating : ratings) {
Toast.makeText(this, rating.criticsScore,Toast.LENGTH_SHORT).show();
}
显示的错误是:
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 28 column 362
如果我注释掉MovieObject
中的部分我在其中声明评级变量...一切正常。所以这似乎就是问题所在。但我不知道如何解决这个问题。只进行原生 Android JSON 解析而不是尝试使用 GSON 会更容易吗?或者惹恼 jackson ?
作为引用,这里是烂番茄响应的 api 查看器:http://jsonviewer.stack.hu/#http://api.rottentomatoes.com/api/public/v1.0/movies/770672122.json?apikey=vg2cj5tgqmbkkxz2vgyxqyh9
最佳答案
嗯,那是因为评级字段不是数组:
"ratings": {
"critics_rating": "Certified Fresh",
"critics_score": 99,
"audience_rating": "Upright",
"audience_score": 91
},
这是一个对象。因此,只需将其声明为 public Ratings ratings;
abridged_directors
,例如,是一个列表:
"abridged_directors": [
{
"name": "Lee Unkrich"
}
],
关于android - 将 GSON 与烂番茄 API 结合使用时出现的问题(Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12630986/