Android 改型1.9-相同的变量名,不同的JSON类型-转换异常

Android 改型1.9-相同的变量名,不同的JSON类型-转换异常,android,retrofit,Android,Retrofit,我有一个名为按钮的JSON键 此JSON键可以采用任何形式、JSON数组或JSON对象。 但是,因为我使用的是POJO,所以我只能定义一种类型的按钮变量。 按钮按钮(对于JSON对象)或列表按钮(对于JSON数组)。 但是,如果按钮的运行时类型与我的变量类型不匹配,这将导致改装的转换异常。 我应该如何处理这种情况?改装2能解决这个问题吗 代码: 当按钮为JSON数组类型时 buttons: [ { title: "key1", value: "value1" }, { title: "key2"

我有一个名为
按钮的JSON键
此JSON键可以采用任何形式、JSON数组或JSON对象。
但是,因为我使用的是POJO,所以我只能定义一种类型的
按钮
变量。
按钮按钮(对于JSON对象)或列表按钮(对于JSON数组)。
但是,如果
按钮的运行时类型与我的变量类型不匹配,这将导致改装的
转换
异常。
我应该如何处理这种情况?改装2能解决这个问题吗

代码:

按钮
为JSON数组类型时

buttons: [
{
title: "key1",
value: "value1"
},
{
title: "key2",
value: "value2"
},
{
title: "key3",
value: "value3"
}
],
按钮
为JSON对象类型时

buttons: {
title: "key",
value: "value"
},

在这种情况下,创建更好的解决方案

您可以使用以下内容:

public class TestDeser implements JsonDeserializer<ButtonList>{
@Override
public ButtonList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    final ButtonList list = new ButtonList();
    if (json.isJsonArray()) {
        for (int i = 0; i < json.getAsJsonArray().size(); i++) {
            final Button btn = context.deserialize(json.getAsJsonArray().get(i), Button.class);
            list.buttons.add(btn);
        }
    } else {
        final Button btn = context.deserialize(json.getAsJsonObject(), Button.class);
        list.buttons.add(btn);
    }
    return list;
}}

你应该考虑在POJO中使用列表/数组,如果你只需要一个按钮对象,你可以在同一个列表/数组中只包含一个项目。你能分享你的JSON样本吗?@ishmaelMakitla我已经编辑了这个问题。请检查。@ishmaelMakitla是的,你是对的。这是一个可能的解决办法。但是,在这种情况下,更改必须在服务器端完成。是否有一些客户端修复程序可以解决此问题?因为只有在从服务器接收到JSON负载后才能知道,所以可能需要检查特定键“
按钮”
”——并根据其类型(JSON数组或JSON对象)您可以使用特殊的POJO来解析有效负载-我确实认为最好使用泛型来表示POJO中
按钮的类型。
new GsonBuilder().registerTypeAdapter(ButtonList.class, new TestDeser()).create();