gpt4 book ai didi

json - 在 Go 中支持动态结构字段的干净解决方案是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 03:35:22 24 4
gpt4 key购买 nike

计划重构我们去年构建的应用程序的代码库。假设我们有这个 api 端点 w/c 支持包括相关资源 GET/api/leagues?include=sport。有没有一种更简洁的方法可以在 api 响应中使 league 资源的 sport 属性动态化? sport 属性的值可以是 int 或 Sport 结构。目前,这就是我们正在做的:

// models/league.go
type League struct {
SportId int64 `json:"-"`
Sport Sport `json:"-"`
SportWrapper interface{} `json:"sport"`
}

// controllers/league.go
include := c.Request.URL.Query().Get("include")
includes := strings.Split(include, ",")

for _, include := range includes {
if include == "sport" {
includeSport = true
}
}

if includeSport {
league.SportWrapper = league.Sport
} else {
league.SportWrapper = league.SportId
}

c.JSON(http.StatusOK, league)

响应api请求:

{
sport: {
id: <id>,
name: <name>
}
}

也可以是:

{
sport: <sport_id>
}

最佳答案

如果没有更多上下文,很难说。我假设 SportId 也是 Sport 结构的一部分。您基本上只返回 ID 或整个结构。

我建议只添加

Sport Sport `json:"-"`

结构。与其直接将其序列化为 json,不如先创建一个具有固定属性集的 map (基本上是一个 View 模型)。您可以在那里设置您的 SportID 或 Sport 结构,然后您可以将 map 序列化为 json。

这也不是一个很好的解决方案,但优点是在您当前的解决方案中,响应代码的丑陋会泄漏到数据模型中,因此会泄漏到应用程序的其余部分。使用中间映射,丑陋的部分被限制在响应生成中。

// models/league.go
type League struct {
Sport Sport
}

... parse includes ...

viewModel := map[string]interface{}

if includeSport {
viewModel["sport"] = league.Sport
} else {
viewModel["sport"] = league.Sport.ID
}

c.JSON(http.StatusOK, viewModel)

关于json - 在 Go 中支持动态结构字段的干净解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42174308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com