gpt4 book ai didi

java - 如何使用 Gson 动态处理 json 响应数组/对象

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:26 25 4
gpt4 key购买 nike

我面临一个问题,有时 Json 响应返回一个对象数组,有时返回对象本身,我们如何在响应类中动态处理。在当前 eg :results 有时会得到一个对象数组

 "\"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 来实现这一点提出任何建议吗?

最佳答案

我找到了一个解决方案,我想分享这个..代码将自动转换..如果异常(exception)响应是响应类中的arraylist ....那么如果对象正在响应则添加到arraylist else if arraylist它将采用相同的列表。 我们需要在它调用 fromJson 之前 Hook 更改响应。

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;
}

然后打电话

 Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create();
SearchResponse response;
esponse= gson.fromJson("your json string", SearchResponse.class)

关于java - 如何使用 Gson 动态处理 json 响应数组/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14373417/

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