首页 > 解决方案 > 如何解析以下 json 使其与 Realm 兼容?

问题描述

我正在使用带有 Gson 的 Retrofit 和 RxJava 来解析 json 响应。我有以下 json。

{
"data": [
{
"name": "Featured Albums",
"slug": "featured-albums",
"items": [
 {
"type": "album",
"title": "Ajambari",
"slug": "ajambariUPC027829302603",
"count": 10,
"duration": "",
"is_explicit": false,
"is_premium": false,
"is_trending": false,
"is_popular": false,
"is_featured": false,
"released_date": "",
"logo": ""
}
],
"total_items": 4,
"per_page_items": 6,
"prev_page_url": null,
"next_page_url": null,
"total_page": 1
},
{
"name": "Featured Movies",
"slug": "featured-movies",
"items": [
{
"id": 41,
"title": "Karamat",
"slug": "NPA0D1802638",
"logo": "",
"background": 
"",
"playlist": false,
"count": 1,
"redirect_link": "",
"created_date": 2013
}
],
"total_items": 9,
"per_page_items": 6,
"prev_page_url": null,
"next_page_url": "",
"total_page": 2
}
]
}

如您所见,“项目”可以具有不同的结构。为此,我使用 JsonArray 将项目解析为:

public class HomeDatum extends RealmObject {

@SerializedName("name")
@Expose
private String name;
@SerializedName("slug")
@Expose
private String slug;
@SerializedName("items")
@Expose
private JsonArray items = null;
@SerializedName("total_items")
@Expose
private Integer totalItems;
@SerializedName("per_page_items")
@Expose
private Integer perPageItems;
@SerializedName("prev_page_url")
@Expose
private String prevPageUrl;
@SerializedName("next_page_url")
@Expose
private String nextPageUrl;
@SerializedName("total_page")
@Expose
private Integer totalPage;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSlug() {
    return slug;
}

public void setSlug(String slug) {
    this.slug = slug;
}

public JsonArray getItems() {
    return items;
}

public void setItems(JsonArray items) {
    this.items = items;
}

public Integer getTotalItems() {
    return totalItems;
}

public void setTotalItems(Integer totalItems) {
    this.totalItems = totalItems;
}

public Integer getPerPageItems() {
    return perPageItems;
}

public void setPerPageItems(Integer perPageItems) {
    this.perPageItems = perPageItems;
}

public String getPrevPageUrl() {
    return prevPageUrl;
}

public void setPrevPageUrl(String prevPageUrl) {
    this.prevPageUrl = prevPageUrl;
}

public String getNextPageUrl() {
    return nextPageUrl;
}

public void setNextPageUrl(String nextPageUrl) {
    this.nextPageUrl = nextPageUrl;
}

public Integer getTotalPage() {
    return totalPage;
}

public void setTotalPage(Integer totalPage) {
    this.totalPage = totalPage;
}

但我收到错误:不支持“com.google.gson.JsonArray”类型的字段“项目”。这是由 Realm 抛出的。如果我不使用 Realm,那么它工作得很好。所以我的问题是如何解析上面的 json 以便它可以被领域支持。先感谢您!!

标签: androidjsonrealm

解决方案


您必须使用 ResponseClass 如下

public class ResponseClass {

@SerializedName("data")
@Expose
private ArrayList<HomeDatum> items;

public ResponseClass(){};


public ArrayList<HomeDatum> getItems() {
    return items;
}

public void setItems(ArrayList<HomeDatum> items) {
    this.items = items;
}

}

并将其传递给 Retrofit 并使用此代码获取响应

ResponseClass response = response.body();
ArrayList<HomeDatum> items = response.getItems();

推荐阅读