Go中的Generic解决方案

时间:2017-08-04 07:34:27

标签: json go

我想为JSON响应创建一个有用的库。在Java中,我已经这样了。我现在开始使用Go,并且不知道如何转换我的Java代码。我读过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": {

  }
}

1 个答案:

答案 0 :(得分:2)

您可以将json-mapping直接添加到结构定义中,并使用编码器,解码器来编组和解组它。这些都是内置的,比其他语言更容易,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