Почему это невозможно?create ArrrayList from Type in java
Type type = newResponse.getDataType().getType();
Class<?> tClass = type.getClass();
Type arrayType = new TypeToken<ArrayList<tClass>>(){}.getType();
Полная десериализатор выглядит следующим образом -
public class NewJsonDesrializer implements JsonDeserializer<NewResponse> {
@Override
public NewResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonElement = json.getAsJsonObject();
NewResponse newResponse = new Gson().fromJson(json, typeOfT);
JsonElement data = jsonElement.get("data");
if(data.isJsonArray()){
Type type = newResponse.getDataType().getType();
Class<?> tClass = type.getClass();
Type arrayType = new TypeToken<ArrayList<tClass>>(){}.getType();
newResponse.setData(new Gson().fromJson(data, arrayType));
}else{
newResponse.setData(new Gson().fromJson(data, newResponse.getDataType().getType()));
}
return newResponse;
}
}
Это бросает ошибку в десериализатор выше в строке -
Error:(36, 54) error: cannot find symbol class tClass
Полный класс NewResponse является следующим образом-
public class NewResponse<T> implements Serializable {
private boolean status;
private String message;
private T data;
private Constants.DataType dataType;
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Constants.DataType getDataType() {
return dataType;
}
public void setDataType(Constants.DataType dataType) {
this.dataType = dataType;
}
}
Перечислим, что r eturns Type
выглядит следующим образом -
public enum DataType{
@SerializedName("user")
USER(User.class);
Type type;
DataType(Type type) {
this.type = type;
}
public Type getType(){
return type;
}
}
Json структура выглядит следующим образом -
{
status:true,
message:"Registration Complete.",
dataType:"user",
data:[
{
username:"[email protected]",
email:"[email protected]",
created_on:"1426663448",
last_login:null,
active:"1",
first_name:"Sachin Gutte",
last_name:"",
company:null,
phone:null,
sign_up_mode:"GOOGLE_PLUS"
},
{
username:"administrator",
email:"[email protected]",
created_on:"1268889823",
last_login:"1425373557",
active:"1",
first_name:"Admin",
last_name:"istrator",
company:"ADMIN",
phone:"0",
sign_up_mode:"SOMEAPP"
}
]
}
Вы можете указывать типы параметров типа напрямую, а не косвенно через переменную. Но поскольку параметры типа в Java не сохраняются во время выполнения (во время выполнения List не знает, является ли это списком Integer или что-то еще), зачем вам нужно указывать его через переменную? –
@ErwinBolwidt Я использую Gson для анализа данных. Код является частью десериализатора. Jsone иногда возвращает один объект или список различных типов классов, то есть модели, которые я имею. Будет обновлен вопрос с подробностями. – SachinGutte
@ErwinBolwidt См. Обновленный вопрос. Json, о котором идет речь, также публикуется. – SachinGutte