'golang json converts int to float. What can i do [closed]

Here is my code. I'm reading from a JSON file and want to insert the value into my global variable mode.

    jsonFile, err := os.Open("config.json")
if err != nil {
    log.Fatal(err)
    return err
}
//byteValue, _ := ioutil.ReadAll(jsonFile)

var responseJson map[string]interface{}
/*if err := json.NewDecoder(jsonFile).Decode(&responseJson); err != nil {
    log.Fatal(err)
    return err
}*/
d := json.NewDecoder(jsonFile)
d.UseNumber()
d.Decode(&responseJson)
mode = responseJson["mode"].(int)


Solution 1:[1]

Type-assert with conversion:

var json_file = bytes.NewReader([]byte(`{"mode":1234}`))

func main() {
    var responseJson map[string]interface{}
    d := json.NewDecoder(json_file)
    if err := d.Decode(&responseJson); err != nil {
        panic(err)
    }
    mode := int(responseJson["mode"].(float64))
    fmt.Println(mode)
}

Type-assert with json.Number

var json_file = bytes.NewReader([]byte(`{"mode":1234}`))

func main() {
    var responseJson map[string]interface{}
    d := json.NewDecoder(json_file)
    d.UseNumber()
    if err := d.Decode(&responseJson); err != nil {
        panic(err)
    }
    i64, err := (responseJson["mode"].(json.Number)).Int64()
    if err != nil {
        panic(err)
    }
    mode := int(i64)
    fmt.Println(mode)
}

With struct:

var json_file = bytes.NewReader([]byte(`{"mode":1234}`))

func main() {
    var responseJson struct{ Mode int }
    d := json.NewDecoder(json_file)
    if err := d.Decode(&responseJson); err != nil {
        panic(err)
    }
    fmt.Println(responseJson.Mode)
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 mkopriva