0

I'm trying to do a simple unmarshall and extracting the int information from the code below. I found a link from another stackoverflow : link. Though, it doesn't help in my case. the program according to ideone think the data is a float.

package main
import "fmt"
import "encoding/json"

func main(){
    byt := []byte(`{"status": "USER_MOVED_LEFT", "id":1, "x":5, "y":3}`)
    var dat map[string]interface{}
    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }
    num := dat["id"].(int)
    fmt.Println(num)
}
kubuni
  • 97
  • 2
  • 10

1 Answers1

4

If you are converting your byt to map[string]interfaec{} the default value of the number will be float64.

func main(){
    byt := []byte(`{"status": "USER_MOVED_LEFT", "id":1, "x":5, "y":3}`)
    var dat map[string]interface{}
    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }

    fmt.Println(reflect.TypeOf(dat["id"])) // print the type of value
    num := dat["id"].(float64)
    fmt.Println(num)
}

But you can also change this behavior by converting your byt which is your data to a struct like this :

type myStruct struct {
    Status string
    Id     int
    x      int
    y      int
}

func main() {
    byt := []byte(`{"status": "USER_MOVED_LEFT", "id":1, "x":5, "y":3}`)
    dat := myStruct{}
    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }

    fmt.Println(reflect.TypeOf(dat.Id))
    fmt.Printf("%+v\n", dat.Id)

}
Gujarat Santana
  • 9,854
  • 17
  • 53
  • 75