2012-09-27 44 views
2

我想解析在Android中使用GSON的爛番茄API的JSON數據。我可以得到它的一些解析,但我似乎有困難與我的基本結果對象內的數組。使用GSON與爛番茄API(Android)的問題

這裏是我的「影片對象」類:

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但在我的評級類不能訪問的字段(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; 
} 

這是我的活動相關的一些摘錄如何我試試以獲取數據。其中大部分工作。

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但BEGIN_OBJECT在行28列362

如果我註釋掉MovieObject中聲明的部分評級變量...事情工作。所以這似乎是問題。但我不知道如何解決這個問題。僅使用原生Android JSON解析而不是嘗試使用GSON會更容易些嗎?或與傑克遜混亂?

僅供參考,這裏是爛番茄響應的API瀏覽器:http://jsonviewer.stack.hu/#http://api.rottentomatoes.com/api/public/v1.0/movies/770672122.json?apikey=vg2cj5tgqmbkkxz2vgyxqyh9

+0

我建議你不要污染你噸'@ SerializedName'類。你可以使用FieldNamingStrategy來代替FieldNamingPolicy.LOWER_CASE_WITH_DASHES。 – maaartinus

+0

好的,謝謝你的建議。我只是從示例中複製了該代碼。 – Xero

回答

2

嗯,那是因爲收視率場不是數組:

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

它是一個對象。所以,僅僅把它聲明爲public Ratings ratings;

abridged_directors,例如,是一個列表:

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

哇。我的新手級別的JSON真的在那裏顯示。我意識到{}表示對象,[]表示數組......並且現在我再看一遍,我看到評級後有{}。看起來不夠緊密,併成爲新手的組合解釋它!非常感謝。 – Xero

+1

沒有問題,發生在每個人:)。 – dmon