2015-11-23 78 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