After reading JSON and Go, I do understand the basics of decoding json in Go are. However, there this problem where that input json can be sometimes a map & sometimes an array of maps.
consider the following problem:
package main
import (
    "encoding/json"
    "fmt"
)
func main() {
    b := []byte(`[{"email":"[email protected]"}]`)
    c := []byte(`{"email":"[email protected]"}`)
    var m interface{}
    json.Unmarshal(b, &m)
    switch v := m.(type) {
    case []interface{}:
        fmt.Println("this is b", v)
    default:
        fmt.Println("No type found")
    }
    json.Unmarshal(c, &m)
    switch v := m.(type) {
    case map[string]interface{}:
        fmt.Println("this is c", v)
    default:
        fmt.Println("No type found")
    }
}
Now, how to I get to the value email: [email protected] in both cases(b & c)
Question:
Play: http://play.golang.org/p/UPoFxorqWl
In my experience, using interface{} to handle json decoding may cause some strange problem, which I tend to avoid it. Although there are ways to achieve it using the reflect package.
Here is a solution for you problem base on your origin solution, hope it helps.
package main
import (
    "encoding/json"
    "fmt"
)
type Item struct {
    Email string `json:email`
}
func main() {
    b := []byte(`[{"email":"[email protected]"}]`)
    //b := []byte(`{"email":"[email protected]"}`)
    var m = &Item{}
    var ms = []*Item{}
    err := json.Unmarshal(b, &m)
    if err != nil {
        err = json.Unmarshal(b, &ms)
        if err != nil {
            panic(err)
        }
        for _, m := range ms {
            fmt.Println(m.Email)
        }
    } else {
        fmt.Println(m.Email)
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With