2017-08-26 2 views
0

Je suis nouveau à Go et j'utilise Gorm pour interroger ma base de données postgres mais j'ai du mal à retourner mes données dans un format de dictionnaire, où le type pokemon sert de clé pour un tableau de tous les pokemon de ce typegolang interrogeant la base de données en utilisant Gorm et retournant json dans la réponse http

JSON: ne peut pas objet unmarshal en valeur Go de type [] models.Pokemon

voici mon code:

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 

J'ai dans ma base de données

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

Je veux retourner des données dans ce format 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"}, 
    ] 
} 

Répondre

1

DB.Where(&Pokemon{Type: t}).Find(&retData.Poke) retourne esentially retour le pointeur *db que vous pouvez utiliser à d'autres méthodes chaîne. Vous désérialisez déjà des lignes postgre dans votre tranche de structure lorsque vous effectuez .Find(&retData.Poke). Ainsi, pokemon n'est pas vraiment ce que vous pensez que c'est.

La seule chose qui reste est maintenant de chaîner .Find() avec un .Error() de sorte que vous pouvez retourner et vérifier toute erreur dans votre requête. Juste comme ceci:

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 
} 

Espérons que ça aide!

+0

merci l'homme! il se trouve que je n'ai pas besoin de marshal/unmarshal aussi puisque les données sont déjà dans retData.Poke – user3226932