多个转换器,用于改造json响应

时间:2016-12-06 14:49:41

标签: android rest retrofit


我正在尝试创建一个基于动态响应的转换器
使用改造,至于现在我有2个不同的答案从服务器返回 - 一个表示失败,一个表示有效的响应如何使用相同的适配器\ callabck尝试解析两个不同的对象?

3 个答案:

答案 0 :(得分:0)

如果数据是json数据,则可以将其解析为java bean。 你可以使用Gson来解析它。

1添加lib

compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.7'

2创建改造     private Retrofit retrofit = new Retrofit.Builder()             .baseUrl(Api.BASE_URL)             .addConverterFactory(GsonConverterFactory.create())             .build();

只需添加一个Gson转换器。

例如,

// success
{"retcode":0,"result":{"vfwebqq":"xxxx"}}
// failed
{"retcode":100,"result":{}}

3创建一个bean来接收数据。

public class Result {
    public String retcode;
    public Info result;

    public static class Info {
        public String vfwebqq;
    }
}

4然后你可以在改造界面中返回一个bean对象。

@GET("xxx")
Result getHome();

答案 1 :(得分:0)

实际上,我并不是在谈论你在说什么以及你面临的确切问题。但是,从我脑海中浮现的第一件事就是提供自定义JsonDeserializer。它应该像这样看起来像smth:

public class CustomDeserializer implements JsonDeserializer<List<CustomData>> {
    @Override
    public List<CustomData> deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        List<CustomData> customDataSet = new ArrayList<>();
        Iterator<JsonElement> iterator = ((JsonObject) json).get("data").getAsJsonObject().get(
                "records").getAsJsonArray().iterator();
        while (iterator.hasNext()) {
            JsonElement element = iterator.next();
            CustomData customData = ServiceGenerator.mGson.fromJson(element, CustomData.class);
            customDataSet.add(customData);
        }
        return customDataSet;
    }
}

这只是一个自定义解析器类示例,它应用于RetrofitBuilder只是为了让生活更轻松(也许)。 之后你需要:

Type listType = new TypeToken<List<CustomData>>() {
    }.getType();
    mGson = new GsonBuilder().registerTypeAdapter(listType, new CustomDeserializer()).create();
    builder =
            new Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create(mGson))
                    .baseUrl(API_BASE_URL);
    retrofit = builder.build();

答案 2 :(得分:0)

根据您的问题,我相信这个网站可以帮助您应对挑战:

https://futurestud.io/tutorials/retrofit-2-introduction-to-multiple-converters