【问题标题】:golang querying database using Gorm and returning json in http responsegolang使用Gorm查询数据库并在http响应中返回json
【发布时间】:2018-02-04 14:23:44
【问题描述】:

我是 Go 新手,我正在使用 Gorm 查询我的 postgres 数据库,但我无法以字典格式返回我的数据,其中 pokemon 的类型用作该类型所有 pokemon 数组的键

p>

json: 无法将对象解组为 []models.Pokemon 类型的 Go 值

这是我的代码:

type Pokemon struct {
    Name   string   `db:"name"`
    Type   string   `db:"type"`
}

pokemonTypes := [6]string{
    "fire",
    "electric",
    "water",
    "grass",
}

var retData struct {
   Poke []Pokemon
}

m := make(map[string][]Pokemon)

for _, t := range pokemonTypes {
    pokemon := DB.Where(&Pokemon{Type: t}).Find(&retData.Poke)
    p, _ := json.Marshal(pokemon)
    err = json.Unmarshal(p, &retData.Poke)  // getting error here
    if err != nil {
        fmt.Println(err)
    }
    m[category] = retData.Poke
}

data, _ := json.Marshal(m) 
w.Write(data)  // http repsonse

我的数据库中有这个

name       | type
----------------------
pikachu    | electric
charmander | fire
blaziken   | fire
venusaur   | grass
treeko     | grass
squirtle   | water

我想返回这个json格式的数据

{
  “electric”: [
    {"name": "pikachu", "type": "electric"},
  ],
  "fire": [
    {"name": "charmander", "type": "fire"},
    {"name": "blaziken", "type": "fire"}
  ],
  "grass": [
    {"name": "venusaur", "type": "grass"},
    {"name": "treeko", "type": "grass"},
  ],
  "water": [
    {"name": "squirtle", "type": "water"},
  ]
}

【问题讨论】:

    标签: json postgresql go go-gorm


    【解决方案1】:

    DB.Where(&Pokemon{Type: t}).Find(&retData.Poke) 本质上返回了*db 指针,您可以使用它来链接更多方法。 当您执行 .Find(&retData.Poke) 时,您已经将 postgre 行反序列化到您的结构切片中。因此,pokemon 实际上并不是您想象的那样。

    现在唯一剩下的就是将.Find().Error() 链接起来,这样您就可以返回并检查查询中的任何错误。就像这样:

    for _, t := range pokemonTypes {
        err := DB.Where(&Pokemon{Type: t}).Find(&retData.Poke).Error()
        if err != nil {
            fmt.Println(err)
            return
        }
        p, _ := json.Marshal(retData.Poke)
        err = json.Unmarshal(p, &retData.Poke) 
        if err != nil {
            fmt.Println(err)
            return
        }
        m[category] = retData.Poke
    }
    

    希望对你有帮助!

    【讨论】:

    • 谢谢你!事实证明我也不需要编组/解组,因为数据已经在 retData.Poke 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2019-04-23
    • 2015-11-26
    • 2014-08-27
    相关资源
    最近更新 更多