使用Retrofit2处理JSON数组中的多个JSON对象类型 [英] handle multiple JSON Objects types in a JSON Array using Retrofit2

查看:284
本文介绍了使用Retrofit2处理JSON数组中的多个JSON对象类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从服务器得到的响应是不同类型的JSON对象的列表,这取决于每个响应的类型".对于每种响应类型,我都有不同的bean. Retrofit可以为列表(JSON数组)中的每个响应(JSON对象)使用适当的Bean类吗?

My response from the server is a list of different types of JSON objects, which depends on each responses' "type". I have different beans for each response type. Can Retrofit use appropriate Bean class for each response (JSON Object)in the list(JSON Array)?

   {
    "cards": [2]
        0:  {
            "type": "A"
            "ID": 24
            "author_name": "ari"
            "title": "BB"
            "permalink": ""
            "created_date": "2015-12-18 17:17:00"
            "post_date": "Dec 18 2015"
            "thumbnail": ""
            "summary": "Stars"
            "thumbSmall": "100.jpg"
            "androidXL": "500.jpg"
        }-
        1:  {
            "type": "B"
            "_id": "3290"
            "read_count": 0
            "categories": [1]
                0:  "abc"      
            "title": "New"
            "isSticky": false
            "section": [0]
            "author": "zzz"
            "india": false
            "update_time": 1450415789694
            "summary": "Social"
            "scoreId": "nz"
            "isActive": true
            "image": ""
            "timestamp": 1450385165210
            "events": [1]
                0:  "nz"
            "teams": [0]
            "slug": "new"
            "isDeleted": false
            "score_str": "SL"
        }
    }

作为一种解决方法,我创建了一个新的Bean类,其中包含所有可能的字段,每个JSON对象的字段中几乎有一半为空.
有更好的方法吗?

As a workaround, I have created a new Bean class, with all possible fields, almost half the fields are null for each JSON Object.
Is there a better way of doing this?

推荐答案

您可以创建一个包含所有类型通用数据的超类并对其进行扩展:

You can create a super class which contains data common for all types and extend it:

public abstract class SuperItem {

 public enum Type {
    @SerializedName("A")
    TYPEA(1),

    @SerializedName("B")
    TYPEB(2);

    Type(final int value) {
        this.value = value;
    }

public static Type fromInteger(int i) {
        switch (i) {
            case 1:
                return TYPEA;
            case 2:
                return TYPEB;
            default:
                Log.d("SuperItem", "No existing type for integer: " + i);
                return null;
        }
    }
}

}

@SerializedName("type") private Type type;
}

public class AItem extends SuperItem {

}
public class BItem extends SuperItem {

}

默认情况下,Retrofit依赖于GSON进行JSON反序列化.您将需要为实现创建定制的Gson解串器并将其设置为RestAdapter:

Retrofit by default relies on GSON for JSON deserialization. You will need to create custom Gson deserializer for your implementation and set it to your RestAdapter:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(SuperItem.class, new SuperItemDeserializer());
Gson gson = builder.build();
 Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

您的自定义反序列化器可能如下所示:

Your custom deserializer can look like this:

public class SuperItemDeserializer implements     JsonDeserializer<SuperItem> {

@Override
public SuperItem deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    Gson gson = new Gson();
    SuperItem item = null;
    JsonObject rootObject = json.getAsJsonObject();
    int typeInt = rootObject.get("type").getAsInt();
    SuperItem.Type type = SuperItem.Type.fromInteger(typeInt);
    switch (type) {
        case TYPEA:
            item = gson.fromJson(json, AItem.class);
            break;
        case TYPEB:
            item = gson.fromJson(json, BItem.class);
            break;
        default:
            Log.d("TAG", "Invalid type: " + typeInt);
    }
    return item;
}
}

希望示例中的命名还不错,您会明白的:)

Hope the naming in the example is not too bad and you'll get the idea :)

这篇关于使用Retrofit2处理JSON数组中的多个JSON对象类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆