Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用gson将json转换为包含模板变量的类的对象_Java_Android_Gson - Fatal编程技术网

Java 使用gson将json转换为包含模板变量的类的对象

Java 使用gson将json转换为包含模板变量的类的对象,java,android,gson,Java,Android,Gson,我的Api响应如下所示 { "status" : 1, "message" : "Some Message", "data" : { } } 我的反应课是这样的。数据类型会根据请求的不同而变化 public class Response<T>{ @Expose @SerializedName("status") private Integer status; @Expose @SerializedName("

我的Api响应如下所示

{
    "status" : 1,
    "message" : "Some Message",
    "data" : {
    }
}
我的反应课是这样的。数据类型会根据请求的不同而变化

public class Response<T>{
    @Expose
    @SerializedName("status")
    private Integer status;

    @Expose
    @SerializedName("message")
    private String message;

    @Expose
    @SerializedName("data")
    private T data;

    //Getters and Setters
}

您需要对模型结构进行一些更改。要做到这一点

创建一个BaseDTO,它只是您的响应类,并用ClassA扩展BaseDTO

基类

public class BaseDto {
    @Expose
    @SerializedName("status")
    protected Integer status;

    @Expose
    @SerializedName("message")
    protected String message;

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
课堂

public class ClassA extends BaseDto implements Parcelable {

    String name;

    protected ClassA(Parcel in) {
        name = in.readString();
        status = in.readByte() == 0x00 ? null : in.readInt();
        message = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        if (status == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeInt(status);
        }
        dest.writeString(message);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<ClassA> CREATOR = new Parcelable.Creator<ClassA>() {
        @Override
        public ClassA createFromParcel(Parcel in) {
            return new ClassA(in);
        }

        @Override
        public ClassA[] newArray(int size) {
            return new ClassA[size];
        }
    };
}
公共类ClassA扩展BasedT以实现可包裹{
字符串名;
受保护的A类(包裹中){
name=in.readString();
status=in.readByte()==0x00?null:in.readInt();
message=in.readString();
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
如果(状态==null){
目标写入字节((字节)(0x00));
}否则{
目标写入字节((字节)(0x01));
目的写入(状态);
}
目的地写入限制(消息);
}
@抑制警告(“未使用”)
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共类A createFromParcel(地块中){
返回新的ClassA(in);
}
@凌驾
公共ClassA[]新数组(整数大小){
返回新的ClassA[尺寸];
}
};
}
使用此网站可生成Parcelable类

要使用gson进行解析,只需将其类型传递给它

我已经编写了一个函数来简化这个。。 将这些保存在Util类中

public static <T> String convertObjectToStringJson(T someObject, Type type) {
    Gson gson = new Gson();
    String strJson = gson.toJson(someObject, type);
    return strJson;
}

public static <T> T getObjectFromJson(String json, Type type) {
    Gson gson = new Gson();
    if (json != null) {
        if (json.isEmpty()) {
            return null;
        }
    }
    return gson.fromJson(json, type);
}
public静态字符串convertObjectToStringJson(T someObject,Type类型){
Gson Gson=新的Gson();
字符串strJson=gson.toJson(someObject,type);
返回strJson;
}
公共静态T getObjectFromJson(字符串json,类型){
Gson Gson=新的Gson();
if(json!=null){
if(json.isEmpty()){
返回null;
}
}
返回gson.fromJson(json,类型);
}
使用这些函数的示例:

ClassA classA = Util.getObjectFromJson(strJson, new TypeToken<ClassA>() {}.getType());

String jsonClassA = Util.convertObjectToStringJson(objClassA, new TypeToken<ClassA>() {}.getType());
ClassA ClassA=Util.getObjectFromJson(strJson,newTypeToken(){}.getType());
字符串jsonClassA=Util.convertObjectToStringJson(objClassA,new-TypeToken(){}.getType());

您需要对模型结构进行一些更改。要做到这一点

创建一个BaseDTO,它只是您的响应类,并用ClassA扩展BaseDTO

基类

public class BaseDto {
    @Expose
    @SerializedName("status")
    protected Integer status;

    @Expose
    @SerializedName("message")
    protected String message;

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
课堂

public class ClassA extends BaseDto implements Parcelable {

    String name;

    protected ClassA(Parcel in) {
        name = in.readString();
        status = in.readByte() == 0x00 ? null : in.readInt();
        message = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        if (status == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeInt(status);
        }
        dest.writeString(message);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<ClassA> CREATOR = new Parcelable.Creator<ClassA>() {
        @Override
        public ClassA createFromParcel(Parcel in) {
            return new ClassA(in);
        }

        @Override
        public ClassA[] newArray(int size) {
            return new ClassA[size];
        }
    };
}
公共类ClassA扩展BasedT以实现可包裹{
字符串名;
受保护的A类(包裹中){
name=in.readString();
status=in.readByte()==0x00?null:in.readInt();
message=in.readString();
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
如果(状态==null){
目标写入字节((字节)(0x00));
}否则{
目标写入字节((字节)(0x01));
目的写入(状态);
}
目的地写入限制(消息);
}
@抑制警告(“未使用”)
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共类A createFromParcel(地块中){
返回新的ClassA(in);
}
@凌驾
公共ClassA[]新数组(整数大小){
返回新的ClassA[尺寸];
}
};
}
使用此网站可生成Parcelable类

要使用gson进行解析,只需将其类型传递给它

我已经编写了一个函数来简化这个。。 将这些保存在Util类中

public static <T> String convertObjectToStringJson(T someObject, Type type) {
    Gson gson = new Gson();
    String strJson = gson.toJson(someObject, type);
    return strJson;
}

public static <T> T getObjectFromJson(String json, Type type) {
    Gson gson = new Gson();
    if (json != null) {
        if (json.isEmpty()) {
            return null;
        }
    }
    return gson.fromJson(json, type);
}
public静态字符串convertObjectToStringJson(T someObject,Type类型){
Gson Gson=新的Gson();
字符串strJson=gson.toJson(someObject,type);
返回strJson;
}
公共静态T getObjectFromJson(字符串json,类型){
Gson Gson=新的Gson();
if(json!=null){
if(json.isEmpty()){
返回null;
}
}
返回gson.fromJson(json,类型);
}
使用这些函数的示例:

ClassA classA = Util.getObjectFromJson(strJson, new TypeToken<ClassA>() {}.getType());

String jsonClassA = Util.convertObjectToStringJson(objClassA, new TypeToken<ClassA>() {}.getType());
ClassA ClassA=Util.getObjectFromJson(strJson,newTypeToken(){}.getType());
字符串jsonClassA=Util.convertObjectToStringJson(objClassA,new-TypeToken(){}.getType());

回答我自己的问题

问题1:

Response<ClassA> response = new Gson().fromJson(jsonString, new TypeToken<Response<ClassA>>(){}.getType());
Response-Response=new Gson().fromJson(jsonString,new TypeToken(){}.getType());
问题2:

把班级改成这个

public class Response<T extends Parcelable>{
@Expose
@SerializedName("status")
private Integer status;

@Expose
@SerializedName("message")
private String message;

@Expose
@SerializedName("data")
private T data;

//Getters and Setters

@Override
public void writeToParcel(Parcel dest, int flags) {
    if (data != null) {
        dest.writeString(data.getClass().getName());
        dest.writeParcelable(data, flags);
    } else dest.writeString(null);
    dest.writeString(message);
    dest.writeInt(status);
}
}

protected Response(Parcel in) {
    String className = in.readString();
    if (className != null) {
        try {
            data = in.readParcelable(Class.forName(className).getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    message = in.readString();
    status = in.readInt();
}
公共类响应{
@暴露
@序列化名称(“状态”)
私有整数状态;
@暴露
@SerializedName(“消息”)
私有字符串消息;
@暴露
@SerializedName(“数据”)
私有T数据;
//接球手和接球手
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
如果(数据!=null){
dest.writeString(data.getClass().getName());
可写入目标(数据、标志);
}else dest.writeString(空);
目的地写入限制(消息);
目的写入(状态);
}
}
受保护响应(包裹中){
String className=in.readString();
if(className!=null){
试一试{
data=in.readParcelable(Class.forName(className).getClassLoader());
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
message=in.readString();
status=in.readInt();
}

回答我自己的问题

问题1:

Response<ClassA> response = new Gson().fromJson(jsonString, new TypeToken<Response<ClassA>>(){}.getType());
Response-Response=new Gson().fromJson(jsonString,new TypeToken(){}.getType());
问题2:

把班级改成这个

public class Response<T extends Parcelable>{
@Expose
@SerializedName("status")
private Integer status;

@Expose
@SerializedName("message")
private String message;

@Expose
@SerializedName("data")
private T data;

//Getters and Setters

@Override
public void writeToParcel(Parcel dest, int flags) {
    if (data != null) {
        dest.writeString(data.getClass().getName());
        dest.writeParcelable(data, flags);
    } else dest.writeString(null);
    dest.writeString(message);
    dest.writeInt(status);
}
}

protected Response(Parcel in) {
    String className = in.readString();
    if (className != null) {
        try {
            data = in.readParcelable(Class.forName(className).getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    message = in.readString();
    status = in.readInt();
}
公共类响应{
@暴露
@序列化名称(“状态”)
私有整数状态;
@暴露
@SerializedName(“消息”)
私有字符串消息;
@暴露
@SerializedName(“数据”)
私有T数据;
//接球手和接球手
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
如果(数据!=null){
dest.writeString(data.getClass().getName());
可写入目标(数据、标志);
}否则