【问题标题】:Issues using GSON with Rotten Tomatoes API (Android)将 GSON 与 Rotten Tomatoes API (Android) 一起使用的问题
【发布时间】:2012-09-27 22:30:34
【问题描述】:

我正在尝试使用 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;
}

我可以成功提取 titleidyear 等字段,但无法访问我的 Rating 类中的字段 (public List&lt;Rating&gt; 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;
}

以下是我尝试获取数据的相关活动的一些摘录。在大多数情况下,哪个有效。

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

显示的错误是:

应为 BEGIN_ARRAY,但在第 28 行第 362 列是 BEGIN_OBJECT

如果我注释掉 MovieObject 中声明 Ratings 变量的部分......一切正常。所以这似乎是问题所在。但我不知道如何解决这个问题。只进行原生 Android JSON 解析而不是尝试使用 GSON 会更容易吗?还是惹杰克逊?

作为参考,这里是烂番茄响应的 api 查看器:http://jsonviewer.stack.hu/#http://api.rottentomatoes.com/api/public/v1.0/movies/770672122.json?apikey=vg2cj5tgqmbkkxz2vgyxqyh9

【问题讨论】:

  • 我建议你不要用大量的@SerializedName 污染你的课程。您可以改用FieldNamingStrategy,可能FieldNamingPolicy.LOWER_CASE_WITH_DASHES 适合。
  • 好的,谢谢您的建议。我只是从一个示例中复制了该代码。

标签: android json gson rotten-tomatoes


【解决方案1】:

嗯,那是因为 rating 字段不是数组:

"ratings": {
    "critics_rating": "Certified Fresh",
    "critics_score": 99,
    "audience_rating": "Upright",
    "audience_score": 91
  },

这是一个对象。因此,只需将其声明为public Ratings ratings;

abridged_directors,例如是一个列表:

"abridged_directors": [
    {
      "name": "Lee Unkrich"
    }
  ],

【讨论】:

  • 哇。我的 JSON 新手级真的在那里展示了。我知道 { } 表示对象,[ ] 表示数组......现在我再看一遍,我看到评级后有 {}。看不够近和是新手的结合解释了它!非常感谢。
  • 没有问题,每个人都会遇到:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多