首页 > 解决方案 > 试图格式化 API 的响应,但我不知道如何

问题描述

您好开发人员我最近碰壁了,试图创建具有许多 2 多关系并属于关系的稍微高级的查询,我成功地使用 GORM 获取了它们,但是我想格式化对我赢得的结构的响应,我做不到这是我的查询我gorm

var p []modules.Posts
tm := modules.Tags{}
db.First(&tm , tagID)
//tag and posts has many 2 many rel
//post belongs to user 
tagMaps := db.Model(&tm).Preload("TagMaps").Preload("User").Related(&p,"Posts")

我正在尝试格式化对此类内容的响应

[
    {
        "id": "post_id",
        "title": "post_title",
        "image" :" post_image",

        "tags":[
            {"name" : "tag_name" , "id" : "tag_id"},
            {"name" : "tag_name" , "id" : "tag_id"},
            {"name" : "tag_name" , "id" : "tag_id"}

        ],
        "user":{
            "id": "user_id",
            "avatar": " user_avatar"
        }

    }
]

这就是gorm响应的样子,正确知道

  {
    "id": 2,
    "title": "thos lore for other users lorem 2",
    "image": "",
    "User": {
        "ID": 1,
        "avatar": "url",
        "user_name": "user 5",
        "email": "newadmin@test.com",
        "password": "password",
        "status": "pea",
        "google_id": "google",
        "facebook_id": "face",
        "account_type": "fb",
        "CreatedAt": "2020-04-02T20:35:38+02:00",
        "UpdatedAt": "2020-04-02T20:35:38+02:00",
        "DeletedAt": null,
        "Posts": null
    },
    "UserRefer": 1,
    "created_at": "2020-04-02T20:36:05+02:00",
    "updated_at": "2020-04-02T20:36:05+02:00",
    "deleted_at": null,
    "TagMaps": [{
            "id": 1,
            "tag_name": "asda",
            "CreatedAt": "2020-04-15T23:25:05+02:00",
            "UpdatedAt": "2020-04-17T21:39:26+02:00",
            "DeletedAt": null,
            "Posts": null
        },
        {
            "id": 2,
            "tag_name": "name",
            "CreatedAt": "2020-04-15T23:25:05+02:00",
            "UpdatedAt": "2020-04-17T21:39:26+02:00",
            "DeletedAt": null,
            "Posts": null
        }
    ]
  },

这是我目前的结构

type Posts struct {
    ID           uint        `json: "id"`
    Title        string      `json: "title"`
    Image        string      `json: "image"`
    User         *User `gorm: "foreignkey:UserRefer"` // use UserRefer as foreign key
    UserRefer uint
    CreatedAt    time.Time   `json: "created_at"`
    UpdatedAt    time.Time   `json: "updated_at"`
    DeletedAt    *time.Time  `sql: "index" json: "deleted_at"`
    TagMaps      []Tags `gorm: "many2many:tag_maps;association_autoupdate:false;association_autocreate:false;"`
}

type Tags struct {
    ID        uint   `gorm: "primary_key" json: "id"`
    Name      string `json: "tag_name"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time `sql: "index"`

    Posts        []*Posts `gorm: "many2many:tag_maps"`
}

type User struct {
    ID          uint   `gorm: "primary_key"`
    Avatar      string `json: "avatar" `
    UserName    string `json: "user_name"`
    Password    string `json: "password"`
    Bio         string `json: "bio"`
    GoogleID    string `json: "google_id"`
    FacebookID  string `json: "facebook_id"`
    AccountType string `json: "account_type"`
    CreatedAt   time.Time
    UpdatedAt   time.Time
    DeletedAt   *time.Time `sql: "index"`

    // Relationship
    Posts   *Posts `gorm: "PRELOAD:false"`
}

任何建议都会被采纳,我的围棋水平不是很好,我一个月前就开始玩了

标签: gogo-gorm

解决方案


不确定您要达到什么目标,但 GORM 响应与您需要的响应相差不远。

您可以尝试在结构中添加更多编码 json 标记吗,即:

  • 忽略“CreatedAt”字段
    CreatedAt   time.Time `json:"-"` 
  • 将“用户”转换为“用户”(也适用于 TagMaps)
    User         *User `gorm: "foreignkey:UserRefer" json:"user"`   

对了,还有json:",omitempty" 忽略空字段

https://golang.org/pkg/encoding/json/#Marshal


推荐阅读