2015-11-23 75 views
0

我使用retrofit 2.0庫從webservice獲得了以下json響應。由於retrofit在內部默認使用Gson將json映射到Java對象。Android翻新2.0使用Gson解析JSON

[ 
    { 
     "album-96": { 
      "id": 96, 
      "m_id": 1, 
      "user_id": null, 
      "p_id": null, 
      "category_id": 1, 
      "sub_category_id": 12, 
      "country_id": 226, 
      "menu_id": null, 
      "name": "Kate Gosselin Photos", 
      "old_name": "Kate Gosselin Photos", 
      "meta_description": "Katie Irene "Kate" Gosselin is an American television personality", 
      "meta_keywords": "Television, Personality", 
      "tags": "", 
      "description": "<p>Katie Irene "Kate" Gosselin is an American television personality</p>", 
      "total_file": 18, 
      "view": 330, 
      "url_str": "kate-gosselin-photos-96", 
      "url": "/album/kate-gosselin-photos-96", 
      "custom_url": "/album/96/kate-gosselin-photos", 
      "old_url": "kate-gosselin-photos-96.html", 
      "created_date": 1440843034, 
      "update_date": 1440866729, 
      "old": "no", 
      "status": "publish", 
      "c_id": 226, 
      "c_name": "United States", 
      "c_url": "united-states", 
      "ca_id": 1, 
      "ca_name": "Actress", 
      "ca_url": "actress", 
      "sca_id": 12, 
      "sca_categories_id": 1, 
      "sca_name": "Television", 
      "sca_url": "television", 
      "array": [ 
       { 
        "id": 5359, 
        "album_path": "/site-content/albums/Kate-Gosselin-Photos/", 
        "title": "Kate Gosselin", 
        "name": "5359.jpg", 
        "custom_url": "/photo/5359/kate-gosselin" 
       }, 
       { 
        "id": 5358, 
        "album_path": "/site-content/albums/Kate-Gosselin-Photos/", 
        "title": "Kate Gosselin", 
        "name": "5358.jpg", 
        "custom_url": "/photo/5358/kate-gosselin" 
       }, 
       { 
        "id": 5357, 
        "album_path": "/site-content/albums/Kate-Gosselin-Photos/", 
        "title": "Kate Gosselin", 
        "name": "5357.jpg", 
        "custom_url": "/photo/5357/kate-gosselin" 
       }, 
       { 
        "id": 5356, 
        "album_path": "/site-content/albums/Kate-Gosselin-Photos/", 
        "title": "Kate gosselin", 
        "name": "5356.jpg", 
        "custom_url": "/photo/5356/kate-gosselin" 
       }, 
       { 
        "id": 5355, 
        "album_path": "/site-content/albums/Kate-Gosselin-Photos/", 
        "title": "Kate Gosselin hair", 
        "name": "5355.jpg", 
        "custom_url": "/photo/5355/kate-gosselin-hair" 
       }, 
       { 
        "id": 5354, 
        "album_path": "/site-content/albums/Kate-Gosselin-Photos/", 
        "title": "Kate gosselin", 
        "name": "5354.jpg", 
        "custom_url": "/photo/5354/kate-gosselin" 
       } 
      ] 
     }, 
     "album-95": { 
      "id": 95, 
      "m_id": 1, 
      "user_id": null, 
      "p_id": null, 
      "category_id": 4, 
      "sub_category_id": 6, 
      "country_id": 226, 
      "menu_id": null, 
      "name": "Christina Maria Aguilera", 
      "old_name": "Christina Maria Aguilera", 
      "meta_description": "Christina María Aguilera is an American singer, songwriter, and actress. Born in Staten Island, New York and raised in Rochester and Wexford, Pennsylvania", 
      "meta_keywords": "Christina Maria Aguilera", 
      "tags": "", 
      "description": "<p>Christina María Aguilera is an American singer, songwriter, and actress. Born in Staten Island, New York and raised in Rochester and Wexford, Pennsylvania</p>", 
      "total_file": 45, 
      "view": 466, 
      "url_str": "christina-maria-aguilera-95", 
      "url": "/album/christina-maria-aguilera-95", 
      "custom_url": "/album/95/christina-maria-aguilera", 
      "old_url": "christina-maria-aguilera-95.html", 
      "created_date": 1435346180, 
      "update_date": 1435346329, 
      "old": "no", 
      "status": "publish", 
      "c_id": 226, 
      "c_name": "United States", 
      "c_url": "united-states", 
      "ca_id": 4, 
      "ca_name": "Music", 
      "ca_url": "music", 
      "sca_id": 6, 
      "sca_categories_id": 4, 
      "sca_name": "Singer", 
      "sca_url": "singer", 
      "array": [ 
       { 
        "id": 5334, 
        "album_path": "/site-content/albums/Christina-Maria-Aguilera/", 
        "title": "Christina Aguilera", 
        "name": "5334.jpg", 
        "custom_url": "/photo/5334/christina-aguilera" 
       }, 
       { 
        "id": 5333, 
        "album_path": "/site-content/albums/Christina-Maria-Aguilera/", 
        "title": "Christina Aguilera", 
        "name": "5333.jpg", 
        "custom_url": "/photo/5333/christina-aguilera" 
       }, 
       { 
        "id": 5332, 
        "album_path": "/site-content/albums/Christina-Maria-Aguilera/", 
        "title": "Christina Aguilera", 
        "name": "5332.jpg", 
        "custom_url": "/photo/5332/christina-aguilera" 
       }, 
       { 
        "id": 5331, 
        "album_path": "/site-content/albums/Christina-Maria-Aguilera/", 
        "title": "Christina Aguilera", 
        "name": "5331.jpg", 
        "custom_url": "/photo/5331/christina-aguilera" 
       }, 
       { 
        "id": 5330, 
        "album_path": "/site-content/albums/Christina-Maria-Aguilera/", 
        "title": "Christina Aguilera", 
        "name": "5330.jpg", 
        "custom_url": "/photo/5330/christina-aguilera" 
       }, 
       { 
        "id": 5329, 
        "album_path": "/site-content/albums/Christina-Maria-Aguilera/", 
        "title": "Christina Aguilera", 
        "name": "5329.jpg", 
        "custom_url": "/photo/5329/christina-aguilera" 
       } 
      ] 
     } 
    } 
] 

我已經使用http://www.jsonschema2pojo.org/爲我的json生成模型類。但是它並沒有給我列出Arraylist中的物品清單。以下是我的代碼

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://girlvalue.com") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     GirlValueAPI girlValueAPI = retrofit.create(GirlValueAPI.class); 
     Call<AlbumsList> call = girlValueAPI.loadAlbums("android"); 
     call.enqueue(this); 

什麼應該是上述json響應的模型類?

+0

*「由於改造使用Gson默認情況下內部將json映射到Java對象」* - 不,不過,Retrofit 2.0不再是這種情況。 *您*指示它使用Gson。 *「但它不會將我在Arraylist中的項目列表返回給我」* - 那麼它會返回什麼?至少你可以提供你現有的模型。另外請記住,Retrofit 1.x和2.0之間的url解析方式不同。只要提到它,以防你的api base url在其路徑中有版本信息。 –

回答

0

不幸的是,你的JSON結構非常複雜。你可以走兩條路。 第一張:爲每個相冊創建一個字段。虛弱的地方:如果出現更多專輯,該應用將崩潰!

class BaseResponse { 
@SerializedName("album-96") 
Album album96; 

@SerializedName("album-95") 
Album album95; 

private class Album{ 

    AlbumItem[] array; 
    Integer id; 
//all of the other fields for Album... 
     } 
} 

另一種方法是兩個用定製的解串器

public AlbumDeserializer implements JsonDeserializer<Album> 
{ 
    @Override 
    public Album deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
    { 
//JSONElement here is your basic JSONArray retrieved from server. 
     Album album = new Album(); 
     String data = json.getAsString(); 
     List<String> albums = Arrays.asList(data.split(" ")); 

     //check if string contains part like album-96 or album-95, or album+ number, using java regex. Work with that string. 
    } 
} 
+0

offcourse更多相冊會出現 –

+0

然後使用第二個選項 – RexSplode

0

您不必在JSON結構中的頂級域。它以數組開始。試試這個:

Call<AlbumsList[]> call = girlValueAPI.loadAlbums("android");

,並獲得loadAlbums(..)方法返回一個數組類型。

+0

什麼應該是albumList []的結構? –

+0

對不起,我不認爲你應該將它讀入'''AlbumsList []'''。將它讀入'''列表'''。當你遍歷這些元素的列表時,獲取與該頂級關鍵字相關聯的JsonElement(因爲它們可以不同 - 例如,album-96和album-95)並將其讀入專輯。在遍歷每個JsonElement時,通過創建一個新的Album()來創建'''列表''''。 – sr09