-1

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)
jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
BigBoy
  • 11
  • 1
  • 5
    Type-assert `float64`, and convert it to `int`. Or use a struct to model your JSON, where you can use `int` type for the field. – icza Mar 18 '22 at 10:29
  • can you gimme a aexaple – BigBoy Mar 18 '22 at 10:30
  • Please, give an example of the code that follows the [MRE](https://stackoverflow.com/help/minimal-reproducible-example), that is a way for a reader to copy/paste your code, and get the same issue. – RafazZ Mar 19 '22 at 05:42

1 Answers1

4

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)
}
mkopriva
  • 35,176
  • 4
  • 57
  • 71
  • 2
    note how simple that `struct` implementation is @BigBoy. all the type handling is done for you, which is why I nearly always decode json into a struct – erik258 Mar 18 '22 at 19:08