0

I'm new to Go and am using Gorm to query my postgres database but am having trouble returning my data in a dictionary format, where the pokemon's type serves as a key to an array of all the pokemon of that type

json: cannot unmarshal object into Go value of type []models.Pokemon

here's my 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

I have this in my database

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

I want to return data in this json format

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

1 Answer 1

2

DB.Where(&Pokemon{Type: t}).Find(&retData.Poke) esentially returns back the *db pointer which you can use to chain further methods. You're already deserializing postgre rows into your struct slice when you do .Find(&retData.Poke). Thus, pokemon isn't actually what you think it is.

The only thing left now is to chain .Find() with a .Error() so that you can return and check any error in your query. Just like this :

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
}

Hope it helps!

Sign up to request clarification or add additional context in comments.

1 Comment

thanks man! turns out i don't need to marshal/unmarshal too since the data is in retData.Poke already

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.