簡體   English   中英

GO:導入一個struct,在json中重命名

[英]GO: import a struct and rename it in json

我用gorm在 go 建立了一個數據庫。 為此,我創建了一個結構,並使用這個結構創建了一個表。 到目前為止,一切都很好。 在后端一切正常,但在前端問題是被調用的 JSON 總是返回大寫的 ID,而swagger為我生成一個小寫的 ID。 Go 中有沒有一種方法可以用 JSON 標識符覆蓋從 gorm 導入的結構?

type Report struct {
   gorm.Model
   CreatedBy          User     `gorm:"foreignKey:CreatedByUserID" json:"createdBy"`
   Archived           bool     `json:"archived"`
}

這個結構給了我以下回應

{
    "ID": 8,
    "CreatedAt": "2022-11-15T20:45:16.83+01:00",
    "UpdatedAt": "2022-12-27T21:34:17.871+01:00",
    "DeletedAt": null
    "createdBy": {
        "ID": 1,
        "CreatedAt": "2022-11-15T20:02:17.497+01:00",
        "UpdatedAt": "2022-11-15T20:02:17.497+01:00",
        ...
    },
    "archived": true,
}

有沒有辦法讓 ID 小寫(比如Archived )? 或者我可以在swaggo中調整它,以便它以大寫形式生成。

我所看到的是,您可以在沒有這個gorm.Model的情況下制作表格,並自己定義所有屬性。 問題是我必須自己創建這些列的所有功能(刪除、更新、索引、主鍵……)。

您可以使用映射結構package

mapstructure 是一個 Go 庫,用於將通用 map 值解碼為結構,反之亦然

如果你想用自定義 json 標簽嵌入 gorm.Model 的 ID 字段,並且你希望它在同一個結構上而不是在“子結構”中,你可以在嵌入的 model 上使用mapstructure:",squash"標簽。

type Model struct {
    ID uint `json:"id"`
}

type Report struct {
    Model    `mapstructure:",squash"`
    Archived bool `json:"archived"`
}

func main() {
    input := map[string]interface{}{
        "id":       1,
        "archived": false,
    }

    var report Report
    if err := mapstructure.Decode(input, &report); err != nil {
        panic(err)
    }

    fmt.Println("Report ID:", report.ID)
    fmt.Println("Report ID via Model:", report.Model.ID)
}

如您所見,使用mapstructure.Decode方法,您可以使用 squash 選項將 map 轉換為結構,然后您可以直接訪問報告的 ID。 請注意,您仍然可以訪問report.Model及其所有字段。

使用 mapstructure,您可以根據需要將 ID 設為小寫,並且還可以直接從報告結構訪問,而不僅僅是從 Model 子結構訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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