gpt4 book ai didi

android - 如何在 Android 上的 Retrofit 中处理可以是 ARRAY 或 OBJECT 的参数?

转载 作者:可可西里 更新时间:2023-11-01 18:45:28 26 4
gpt4 key购买 nike

我遇到一个问题,我正在解析的 API 为大小为 1 的 ARRAY 返回一个 OBJECT。

例如,有时 API 会响应:

{
"monument": [
{
"key": 4152,
"name": "MTS - Corporate Head Office",
"categories": {},
"address": {}
},
{
"key": 4151,
"name": "Canadian Transportation Agency",
"categories": {},
"address": {}
},
{
"key": 4153,
"name": "Bank of Montreal Building",
"categories": {},
"address": {}
}
],
}

但是,如果 monument 数组只有 1 个项目,它将变成一个 OBJECT(注意缺少 [] 括号),如下所示:

{
"monument": {
"key": 4152,
"name": "MTS - Corporate Head Office",
"categories": {},
"address": {}
}
}

如果我这样定义我的模型,当只返回一个项目时我会得到一个错误:

public class Locations {
public List<Monument> monument;
}

如果只返回一个项目,我会收到以下错误:

Expected BEGIN_OBJECT but was BEGIN_ARRAY ...

如果我这样定义我的模型:

public class Locations {
public Monument monument;
}

API 返回一个 ARRAY 我得到相反的错误

Expected BEGIN_ARRAY  but was BEGIN_OBJECT ...

我无法在我的模型中定义多个具有相同名称的项目。我该如何处理这种情况?

注意:我无法更改 API。

最佳答案

诀窍是为您的 Locations编写您自己的 Gson 解串器。这将检查纪念碑元素是对象还是数组。像这样:

public class LocationsDeserializer implements JsonDeserializer<Locations> {

@Override
public Locations deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

JsonElement monumentElement = json.getAsJsonObject().get("monument");
if (monumentElement.isJsonArray()) {
return new Locations((Monument[]) context.deserialize(monumentElement.getAsJsonArray(), Monument[].class));
} else if (monumentElement.isJsonObject()) {
return new Locations((Monument) context.deserialize(monumentElement.getAsJsonObject(), Monument.class));
} else {
throw new JsonParseException("Unsupported type of monument element");
}
}
}

为方便起见,将可变参数构造函数添加到您的 Locations 类:

public class Locations {
public List<Monument> monuments;

public Locations(Monument ... ms) {
monuments = Arrays.asList(ms);
}
}

您的纪念碑类保持不变。像这样的东西:

public class Monument {
public int key;
public String name;
// public Categories categories;
// public Address address;
}

最后,创建自己的Gson对象,并将其传递给改造的RestAdapter

Gson gson = new GsonBuilder().registerTypeAdapter(Locations.class, new LocationsDeserializer()).create();

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(baseUrl)
.setConverter(new GsonConverter(gson))
.build();

关于android - 如何在 Android 上的 Retrofit 中处理可以是 ARRAY 或 OBJECT 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26500772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com