用 gson 改造。如何解析响应?
Retrofit with gson. How parse response?
我在项目中使用改造和 gson。
答案来自服务器,格式为
{
1:"user1",
2: "user2"
}
我有结构 pojo
public class User {
@Expose
@Getter
@Setter
private int uid;
@Expose
@Getter
@Setter
private String nick;}
并请求改造
@Get("/")
User getPojousers();
但是响应动态键。如何描述 class 的响应?
您必须自己解析 Users
class(例如 SparseArray
):
public static class Users implements JsonDeserializer<User> {
public SparseArray<String> values = new SparseArray<>();
@Override
public Users deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Users u = new Users();
if (json.isJsonObject()) {
JsonObject obj = (JsonObject) json;
for (Map.Entry<String, JsonElement> elem : obj.entrySet()) {
if (Util.isInteger(elem.getKey())) {
u.values.put(Integer.parseInt(elem.getKey()), elem.getValue().getAsString());
}
}
}
return u;
}
}
为了完成这项工作,将 TypeAdapter 添加到 Gson
实例:
private static GsonConverter getConverter() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Users.class, new Users());
return new GsonConverter(builder.create());
}
并在 RestAdapter
实例中使用此转换器:
mInstance = new RestAdapter
.Builder()
.setConverter(getConverter())
.//
.create(...)
这是一个自定义适配器,它将 return 该对象的用户列表。 (您可能需要首先修复 json 以使其有效)
@Override
public List<User> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<User> result = new ArrayList<>();
for (Map.Entry<String, JsonElement> elem : json.getAsJsonObject().entrySet()) {
result.add(new User(Integer.parseInt(elem.getKey()), elem.getValue()));
}
return result;
}
当然,您的 User
class 需要一个带有这 2 个参数的构造函数。
我在项目中使用改造和 gson。 答案来自服务器,格式为
{
1:"user1",
2: "user2"
}
我有结构 pojo
public class User {
@Expose
@Getter
@Setter
private int uid;
@Expose
@Getter
@Setter
private String nick;}
并请求改造
@Get("/")
User getPojousers();
但是响应动态键。如何描述 class 的响应?
您必须自己解析 Users
class(例如 SparseArray
):
public static class Users implements JsonDeserializer<User> {
public SparseArray<String> values = new SparseArray<>();
@Override
public Users deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Users u = new Users();
if (json.isJsonObject()) {
JsonObject obj = (JsonObject) json;
for (Map.Entry<String, JsonElement> elem : obj.entrySet()) {
if (Util.isInteger(elem.getKey())) {
u.values.put(Integer.parseInt(elem.getKey()), elem.getValue().getAsString());
}
}
}
return u;
}
}
为了完成这项工作,将 TypeAdapter 添加到 Gson
实例:
private static GsonConverter getConverter() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Users.class, new Users());
return new GsonConverter(builder.create());
}
并在 RestAdapter
实例中使用此转换器:
mInstance = new RestAdapter
.Builder()
.setConverter(getConverter())
.//
.create(...)
这是一个自定义适配器,它将 return 该对象的用户列表。 (您可能需要首先修复 json 以使其有效)
@Override
public List<User> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<User> result = new ArrayList<>();
for (Map.Entry<String, JsonElement> elem : json.getAsJsonObject().entrySet()) {
result.add(new User(Integer.parseInt(elem.getKey()), elem.getValue()));
}
return result;
}
当然,您的 User
class 需要一个带有这 2 个参数的构造函数。