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

时间:2016-08-11 08:46:29

标签: java android gson

我的Api回复看起来像这样。

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
}

我的Response类看起来像这样。数据类型根据要求而变化。

Response<ClassA> response = new Gson().fromJson(jsonString, ??);

问题1.如何使用gson解析这个json?

dest.writeInt(status == null ? 0:status);
dest.writeString(message);
??

问题2.我将如何为此类编写Parcelable实现。

.class:after{
content:"";
border:10px solid transparent;
border-top-color:red;
}

2 个答案:

答案 0 :(得分:0)

您需要在模型结构中进行一些更改。要这样做..

创建一个BaseDTO,它只是您的Response类,并使用您的ClassA扩展您的BaseDTO。

BaseDto.class

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

ClassA.class

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

使用此网站生成Parcelable类http://www.parcelabler.com/

使用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);
}

使用这些功能的例子:

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

String jsonClassA = Util.convertObjectToStringJson(objClassA, new TypeToken<ClassA>() {}.getType());

答案 1 :(得分:0)

回答我自己的问题。

问题1:

Response<ClassA> response = new Gson().fromJson(jsonString, new TypeToken<Response<ClassA>>(){}.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();
}