如何为 Gson 编组和解组创建通用方法?
Posted
技术标签:
【中文标题】如何为 Gson 编组和解组创建通用方法?【英文标题】:How to create Generic method for Gson marshal and unmarshal? 【发布时间】:2018-04-05 16:25:55 【问题描述】:我是泛型新手。
我尝试创建通用 Gson 编组(即 gson.toJson())和解组(即 gson.fromJson())方法。
public class Message
private MessageBody messageBody;
....
public class MessageBody
private List<BodyParam> bodyParams;
public class MessageBodyParam
private String name;
private Object value;
public class JsonUtil
//This is not working
public static <T> String marshal(Object object, Class<T> jtype)
Gson gson = new Gson();
Type type = new TypeToken<T>() .getType();
return gson.toJson(object, type);
//this is working as expected
public static <T> T unmarshal(String jsonStr, Class<T> jtype)
Gson gson = new Gson();
Type type = new TypeToken<T>() .getType();
return gson.fromJson(jsonStr, type);
我将这些方法称为如下:
//Message is my class
String jsonMessage = JsonUtil.marshal(message, Message.class);
Message message = JsonUtil.unmarshal(message, Message.class);
如何在JsonUtil.marshal()中接收类类型并返回String对象?
请帮我解决这个问题。 谢谢。
【问题讨论】:
new TypeToken<T>()
实际上无法工作。您需要使用jtype
。
@SLaks 是的,我尝试使用 jtype,但它给出“原因:java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ....”,因为我的Message.class 也有一些集合属性。当我在 SO 中搜索时。我开始了解 TypeToken
你完全误解了TypeToken
的作用。
@SLaks 我已经用 Message.class 及其子类更新了这个问题。请让我知道如何在不使用 TypeToken 的情况下解决异常“由:java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ....”。谢谢
什么是完整的异常消息和堆栈跟踪?
【参考方案1】:
为时已晚,但这个解决方案对我来说可以为 gson 创建一个通用类:
public class JSONConversion<T>
private T t;
public T getT()
return t;
public void setT(T t)
this.t = t;
public String ObjectToString()
Gson gson=new Gson();
return gson.toJson(t);
public T StringToObject(String jsonString ,Class<T> tt)
Gson gson=new Gson();
return gson.fromJson(jsonString, tt);
你可以像这样使用这个通用的 gson 类:
LoginResponse loginResponse = response.body();
JSONConversion<LoginResponse> jsonConversion=new JSONConversion<>();
jsonConversion.setT(loginResponse);
String createdJson=jsonConversion.ObjectToString());
Log.d("toJson",createdJson);
LoginResponse convertedObject=jsonConversion.StringToObject(createdJson,LoginResponse.class);
【讨论】:
以上是关于如何为 Gson 编组和解组创建通用方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何为Sqlalchemy中的各种模型编写一个通用的get_by_id()方法?
如何在 Parcel 的帮助下将 Parcelable 编组和解组为字节数组?
如何为通用 Windows 平台(UWP)应用程序创建 .appx 包?