簡體   English   中英

Golang使用Gorm查詢數據庫並在http響應中返回json

[英]golang querying database using Gorm and returning json in http response

我是Go的新手,正在使用Gorm查詢我的postgres數據庫,但是在以字典格式返回數據時遇到了麻煩,其中,神奇寶貝的類型用作所有該類型神奇寶貝的數組的鍵

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

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
}

希望能幫助到你!

暫無
暫無

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

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