2017-08-04 37 views
-3

我想爲JSON響應制作一個有用的庫。在Java中,我已經這樣做了。我現在開始使用Go,並且不知道如何轉換我的Java代碼。我讀過Go沒有像泛型一樣的東西,但我該如何解決我的問題?Go中的泛型解決方案

我說的是下面的代碼部分:

@Data 
public class ServiceResult<T extends Serializable> implements Serializable { 

    private ServiceResultStatus status; 
    private String type; 
    private T content; 
    private String hash; 
    private String destination; 
    private HashMap<String, Metadata> metadata = new HashMap<>(); 

... 

的服務結果的想法是提供RESTful Web服務的結構模式。如果您需要了解更多信息,這裏是鏈接到我的回購在Github上:在結束這樣https://github.com/Viascom/service-result

服務,結果如下:

{ 
    "status": "successful", 
    "type": "ch.viascom.example.models.response.GetTasksResponse", 
    "content": [ 
    { 
     "id": "3e99c7fb-0ed7-11e7-a7a5-0050569c3e5a", 
     "name": "Example Task" 
    } 
    ], 
    "hash": "7bf9c04d1e9f8fe7995e4b8beeac1a4c830e7ea", 
    "destination": "ch.viascom.example.handler.TaskHandler", 
    "metadata": { 

    } 
} 
+3

第一個提示:不要將Java(或任何其他語言)轉換爲Go。使用Go成語編寫新代碼。 – Flimzy

+0

@在這種特殊情況下,「非常習慣」是指「複製粘貼」? – zerkms

+1

@zerkms:我不知道你的意思。我也不知道你在做什麼,因爲你沒有包含任何函數代碼 - 只有數據類型和定義。所以很難規定Go成語對未知的問題。 – Flimzy

回答

2

您可以直接添加JSON映射到結構定義並使用編碼器,解碼器對其進行編組和解組。它的內置和其他語言比imho更容易。

type ServiceResponse struct { 
    Value string`json:"nameInJsonResponse"` 
} 

這裏是從操場一個很好的例子:https://play.golang.org/p/4L2wMVv7tW

您的特定情況下,它應該是這樣的:

type ServiceResult struct { 
    Status ServiceResultStatus`json:"status"` 
    Type string`json:"type"` 
    Hash string`json:"hash"` 
    Destination string`json:"destination"` 
    Metadata map[string]Metadata metadata`json:"metadata"` 
} 

type ExplizitServiceResult struct { 
    ServiceResult 
    Content SomeStruct`json:"content"` 
} 

https://play.golang.org/p/FFfiq6LxVt

如果你不想要從ServiceResult派生每個用戶結構,您可以將內容定義爲interface{},以便可以插入每個結構。我已經爲此更新了我的示例。也許這是解決您的問題的最簡單的解決方案。 https://play.golang.org/p/LNgreqrnnw

+0

那麼你如何爲OP提供的結構做這件事?您在操場上的參考很簡單,與OP觀察到的問題無關。 – zerkms

+0

編輯我的答案。我認爲這應該工作。 – Auskennfuchs

+0

現在確實好多了。 – zerkms