【问题标题】:How to create Generic method for Gson marshal and unmarshal?如何为 Gson 编组和解组创建通用方法?
【发布时间】: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&lt;T&gt;() {} 实际上无法工作。您需要使用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 无法转换为 ....”。谢谢
  • 什么是完整的异常消息和堆栈跟踪?

标签: java json generics gson


【解决方案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);

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多