[英]Use Gson library with a generic class as a field of the class to serialize
在對Google和Stack Overflow進行了多項研究之后,我沒有找到類似的案例。
我需要使用Gson庫將Java對象轉換為Json。 事實是,此對象包含一個具有自定義通用類型的字段,如下所示:
SendData.java:
public class SendData {
private SendDataRequestObject<?> sendData;
// Constructor + Getters and Setters
}
這是SendDataRequestObject的類定義:
public class SendDataRequestObject<T> {
private String actionType;
private T parameters;
private CustomClass customClass;
//Constructor + Getters and Setters
}
最后,可以將MyRequest的類定義作為T參數注入到SendDataRequestObject中
public class MyRequest {
private Map<Integer, String> myMap;
private String myString1;
private String myString2;
//Constructor + Getters and Setters
}
實際上,我可以使用Gson庫解析SendDataRequestObject,如下所示:
SendDataRequestObject<MyRequest> requestObject = new SendDataRequestObject<MyRequest>();
//...
//Initializing and adding fields to requestObject
//...
Type token = new TypeToken<SendDataRequestObject<MyRequest>>(){}.getType();
System.out.println(new GsonBuilder().create().toJson(requestObject, token));
輸出設置正確,每個字段,包括通用字段,都包含在最終的json字符串中:
{"actionType":"verify","parameters":{"myMap":{"15789":"hreher-489hre-gdsf","13057":"rtyuiop-4g8ezg","16741":"gfd456-uiop789"},"myString1":"myStringValue1","myString2":"myStringValue2"},"customClas":{"attr1":"value1","attr2":"value2"}}
但是我需要的是解析SendData類,而不是SendDataRequestObject類。 當我嘗試將此類轉換為json字符串時,獲得以下輸出:
{"sendData":{"actionType":"verify","parameters":{},"customClass":{"attr1":"value1","attr2":"value2"}}}
因此,我們可以看到SendDataRequestObject的parameters字段沒有轉換為Json,可能是因為這是一個通用類。
如果有人對如何做有任何想法,我將不勝感激!
由於Java的類型擦除,您不能以某種方式在編譯時不知道類型T
,就無法做到這一點。
一種選擇是JSON可以包含一些指定類型的信息,例如
{
"sendDataType": "MyRequest",
"sendData": {
...
}
}
如果然后使SendData通用,例如
SendData<T> {
private SendDataRequestObject<T> sendData;
}
然后,您可以解析一次JSON來找出sendDataType
:
SendData<?> genericSendData = new GsonBuilder().create().toJson(requestObject, new TypeToken<SendData<?>>(){});
String sendDataType = genericSendData.sendDataType;
並使用它來創建正確類型的TypeToken
:
switch(sendDataType) {
case "MyRequest":
return new TypeToken<MyRequest>(){};
}
現在就知道了,然后再次解析JSON以指定通用類型:
SendData<?> myRequestSendData = new GsonBuilder().create().toJson(requestObject, typeToken);
之所以可行,是因為我們的switch語句在編譯時就知道了可能的類型,並可以為它們創建TypeTokens。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.