Java 使用gson将json转换为包含模板变量的类的对象
我的Api响应如下所示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("
{
"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());
可写入目标(数据、标志);
}否则