簡體   English   中英

將具有通用類的Gson庫用作要序列化的類的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM