Search code examples
gogo-gormgo-swagger

GO: import a struct and rename it in json


I have built a database in go with gorm. For this I created a struct and with this struct I created a table. So far so good. In the backend everything works, but in the frontend the problem is that the JSON which is called always returns the ID in upper case and swagger generates me an ID which is lower case. Is there a way in Go that I can overwrite the imported struct from gorm with a JSON identifier?

import "gorm.io/gorm"

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

This Struct gives me the following response

{
    "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,
}

Is there a way to make the ID lowercase (like Archived)? Or can I adjust it at swaggo so that it is generated in upper case.

What I have seen is that you can make the table without this gorm.Model and define all the attributes yourself. The problem is that I then have to create all the functionalities (delete, update, index, primary key, ...) of these columns myself.


Solution

  • I create my own gorm-model-struct:

    type GormModel struct {
        ID        uint           `gorm:"primarykey" json:"id"`
        CreatedAt time.Time      `json:"createdAt"`
        UpdatedAt time.Time      `json:"updatedAt"`
        DeletedAt gorm.DeletedAt `gorm:"index" json:"deletedAt"`
    } //@name models.gormModel
    
    

    I import this struct into the other structs:

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

    Important is, that you add the json-key and set the attribute name.