Java 如何使用Gson动态处理json响应数组/对象
我面临一个问题,有时Json响应返回一个对象数组,有时返回对象本身,我们如何在响应类中动态处理。 在当前的示例中,results有时会获取一个对象数组Java 如何使用Gson动态处理json响应数组/对象,java,android,gson,Java,Android,Gson,我面临一个问题,有时Json响应返回一个对象数组,有时返回对象本身,我们如何在响应类中动态处理。 在当前的示例中,results有时会获取一个对象数组 "\"results\": " + "[{" + 有时会反对自己 "\"results\": " + "{" + 例如: 我们如何处理这件事 Gson gson = new Gson(); SearchResponse response=new SearchResponse();
"\"results\": " +
"[{" +
有时会反对自己
"\"results\": " +
"{" +
例如:
我们如何处理这件事
Gson gson = new Gson();
SearchResponse response=new SearchResponse();
response= gson.fromJson("{" +
"\"completed_in\": 0.047," +
"\"max_id\": 291771567376039936," +
"\"max_id_str\": \"291771567376039936\"," +
"\"next_page\": \"?page=2&max_id=291771567376039936&q=javacodegeeks\"," +
"\"page\": 1," +
"\"query\": \"javacodegeeks\"," +
"\"refresh_url\": \"?since_id=291771567376039936&q=javacodegeeks\"," +
"\"results\": " +
"{" +
"\"created_at\": \"Thu, 17 Jan 2013 04:58:57 +0000\"," +
"\"from_user\": \"hkokko\"," +
"\"from_user_id\": 24726686," +
"\"from_user_id_str\": \"24726686\"," +
" \"from_user_name\": \"Hannu Kokko\"," +
" \"geo\": null," +
"\"id\": 291771567376039936," +
"\"id_str\": \"291771567376039936\"," +
"\"iso_language_code\": \"en\"," +
" \"metadata\": {" +
"\"result_type\": \"recent\"}," +
"\"profile_image_url\": \"hjh\"," +
"\"profile_image_url_https\": \"kkj\"," +
"\"source\": \"<a href="hj;\"," +
"\"text\": \"Continuous Deployment: Are You Afraid It Might Work? jh\"," +
"\"to_user\": null," +
"\"to_user_id\": 0," +
"\"to_user_id_str\": \"0\"," +
"\"to_user_name\": null" +
" }," +
"\"results_per_page\": 15," +
"\"since_id\": 0," +
"\"since_id_str\": \"0\"" +
"}", SearchResponse.class);
System.out.println(response.toString());
请协助
任何人都可以通过使用不同的JAR来提供建议吗?您需要编写一个自定义反序列化程序,检查JSON中的
结果类型,然后相应地执行操作
POJO将包含一个用于结果的数组
,如果传入的JSON只有一个对象,则需要修复它。一种方法是修改JSON,然后将其反序列化:
class SearchResponseDeserializer implements JsonDeserializer<SearchResponse> {
public SearchResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
if (json.getAsJsonObject().get("results").isJsonObject()) {
//modify JSON: change results to be an array
// ...
}
return new Gson().fromJson(json, SearchResults.class);
}
}
类SearchResponseDeserializer实现JsonDeserializer{
公共SearchResponse反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)
抛出JsonParseException{
if(json.getAsJsonObject().get(“results”).isJsonObject()){
//修改JSON:将结果更改为数组
// ...
}
返回新的Gson().fromJson(json,SearchResults.class);
}
}
当然,也可以修复服务器。它应该始终返回一个数组以避免此问题 我找到了一个解决方案,我想分享一下..代码会自动转换..如果响应类中的异常响应是arraylist….那么如果对象响应,那么添加到arraylist,否则如果arraylist,它将采用相同的列表。
我们需要钩子更改它从JSON调用之前的响应
public class ArrayAdapter<T> extends TypeAdapter<List<T>> {
private Class<T> adapterclass;
public ArrayAdapter(Class<T> adapterclass) {
this.adapterclass = adapterclass;
}
public List<T> read(JsonReader reader) throws IOException {
List<T> list = new ArrayList<T>();
Gson gson = new Gson();
if (reader.peek() == JsonToken.BEGIN_OBJECT) {
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
} else if (reader.peek() == JsonToken.BEGIN_ARRAY) {
reader.beginArray();
while (reader.hasNext()) {
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
}
reader.endArray();
} else {
reader.skipValue();
}
return list;
}
public void write(JsonWriter writer, List<T> value) throws IOException {
}
}
public class ArrayAdapterFactory implements TypeAdapterFactory {
@SuppressWarnings({ "unchecked" })
@Override
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) {
ArrayAdapter typeAdapter = null;
try {
if (type.getRawType() == List.class)
{
typeAdapter = new ArrayAdapter(
(Class) ((ParameterizedType) type.getType())
.getActualTypeArguments()[0]);
}
} catch (Exception e) {
e.printStackTrace();
}
return typeAdapter;
}
这样的服务器实现是不好的。它是你的后端?它的客户端,我从服务器收到这个响应。如果服务器返回一个对象数组,它总是包含一个对象还是可以包含多个对象?如果它是一个数组,你会处理它的每个元素吗?看看这个问题,它在TypeAdapter=null处给出了错误;对于您可以通过修改类签名来解决此问题,例如修改公共类ArrayAdapterFactory实现TypeAdapterFactory{com.google.gson.internal。$gson$Types$ParameterizedTypeImpl无法在映射时转换为java.lang.class在使用上述示例时出错
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create();
SearchResponse response;
esponse= gson.fromJson("your json string", SearchResponse.class)