Search code examples
jsongodecode

json.Decode doesn't decode numbers


I basically copypasted this code from the documentation of the json package. In the provided example, the values of the JSON objects are strings. Here, I tried using integers instead.

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "strings"
)

func main() {
    const jsonStream = `{"serverTime":35678}`

    type Message struct {
        serverTime int
    }
    
    dec := json.NewDecoder(strings.NewReader(jsonStream))
    for {
        var m Message
        if err := dec.Decode(&m); err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("its %v o clock\n", m.serverTime)
    }
}

m.ServerTime should now be 35678, however, it's just 0. What am I doing wrong?


Solution

  • as document describes

    The json package only accesses the exported fields of struct types (those that begin with an uppercase letter). Therefore only the the exported fields of a struct will be present in the JSON output.

    so change serverTime to ServerTime, and add json tags json:"serverTime"

    package main
    
    import (
        "encoding/json"
        "fmt"
        "io"
        "log"
        "strings"
    )
    
    func main() {
        const jsonStream = `{"serverTime":35678}`
    
        type Message struct {
            ServerTime int `json:"serverTime"`
        }
    
        dec := json.NewDecoder(strings.NewReader(jsonStream))
        for {
            var m Message
            if err := dec.Decode(&m); err == io.EOF {
                break
            } else if err != nil {
                log.Fatal(err)
            }
            fmt.Printf("its %v o clock\n", m.ServerTime)
        }
    }