gpt4 book ai didi

android - 使用 Gson 反序列化复杂的 JSON(几个嵌套元素)

转载 作者:行者123 更新时间:2023-11-30 00:43:05 24 4
gpt4 key购买 nike

我正在尝试将一个 JSON 对象(来自 API)反序列化为它们各自的 Java 对象。我正在使用 gson 库(适用于 Android)。问题是我已经尝试了好几天并测试了很多选项,但都没有成功,所以我真的很感激能在这方面提供一点帮助。

*检索到 JSON。我从 API 收到的所有 JSON 都遵循以下结构:

{
"status_code": 200,
"status_message": "Here the status message",
"result": {
"success": true,
"internalStatusCall": 1,
"response":
/* Can be a JSON object or a JSON array of objects */
}
}

由于收到的所有 JSON 的结构都是相似的,我想利用这一点并扩展对象以从 JSON 映射。

我会这样想:

public class TABaseObject {

@SerializedName("status_code")
protected int status_code;

@SerializedName("status_message")
protected String status_message;

protected String type;

public TABaseObject(int status_code, String status_message, String type) {
this.status_code = status_code;
this.status_message = status_message;
this.type = type;
}
}

从这个对象扩展,内部对象将是:

public class TAResultObject extends TABaseObject{

@SerializedName("exito")
protected boolean exito;

@SerializedName("codigoEstado")
protected int codigoEstado;

public TAResultObject(int status_code, String status_message, boolean exito, int codigoEstado) {
super(status_code, status_message, "resultado");
this.exito = exito;
this.codigoEstado = codigoEstado;
}

@Override
public String toString() {
return super.toString() + " ////// " + "TAResultObject{" +
"exito=" + exito +
", codigoEstado=" + codigoEstado +
'}';
}

从这个其他对象,我会将 TAResultObject 扩展到相应的对象。

我尝试了几种反序列化方法(TypeAdapterFactory、RuntimeTypeAdapterFactory 等),但没有成功。

是否有任何策略能够反序列化上述 JSON。如果您对此有任何帮助,我将不胜感激。

最佳答案

这是我的响应类解决方案,

import java.util.List;
import java.util.Map;

import com.google.gson.annotations.SerializedName;

public class TAObject {

@SerializedName("status_code")
Integer status_code ;

@SerializedName("status_message")
String status_message ;

@SerializedName("result")
Result result ;

public class Result {

@SerializedName("success")
Boolean success ;

@SerializedName("internalStatusCall")
Integer internalStatusCall ;

@SerializedName("response")
List<Map> response ;

}
}

将此类与 Gson 的自定义 TypeAdapter 一起使用。然后它将适用于 List 和 Object 响应。

数组适配器类

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


class ArrayAdapter<T> extends TypeAdapter<List<T>> {

private Class<T> adapterclass;

public ArrayAdapter(Class<T> adapterclass) {
this.adapterclass = adapterclass;
}

@Override
public List<T> read(JsonReader reader) throws IOException {

List<T> list = new ArrayList<T>();
Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ArrayAdapterFactory()).create();

final JsonToken token = reader.peek();
System.out.println(token);
// Handling of Scenario 2( Check JavaDoc for the class) :
if (token == JsonToken.STRING || token == JsonToken.NUMBER ||
token == JsonToken.BOOLEAN) {
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
} else if (token == JsonToken.BEGIN_OBJECT) {
// Handling of Scenario 1(Check JavaDoc for the class) :
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
} else if (token == JsonToken.BEGIN_ARRAY) {
reader.beginArray();
while (reader.hasNext()) {
@SuppressWarnings("unchecked")
T inning = (T) gson.fromJson(reader, adapterclass);
list.add(inning);
}
reader.endArray();
}

return list;
}

@Override
public void write(JsonWriter writer, List<T> value) throws IOException {

}


}

ArrayAdapterFactory 类

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

public class ArrayAdapterFactory implements TypeAdapterFactory {

@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type)
{

TypeAdapter<T> typeAdapter = null;
try {
if (type.getRawType() == List.class || type.getRawType() == ArrayList.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();

关于android - 使用 Gson 反序列化复杂的 JSON(几个嵌套元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42252063/

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