On Thu, 2 Mar 2017 02:29:22 -0800 (PST)
Basile Starynkevitch <bas...@starynkevitch.net> wrote:

> I want to JSON encode a float64 point number always as a JSON float,
> so 1.0 should be encoded as 1.0 not as 1 because at decoding time I
> want to distinguish them.
[...]

Use custom type with a custom marshaler [1]:

------------>8------------    
    package main
    
    import (
        "encoding/json"
        "fmt"
        "math"
        "os"
    )
    
    type myFloat64 float64
    
    func (mf myFloat64) MarshalJSON() ([]byte, error) {
        const ε = 1e-12
        v := float64(mf)
        w, f := math.Modf(v)
        if f < ε {
                return []byte(fmt.Sprintf(`%v.0`, math.Trunc(w))), nil
        }
        return json.Marshal(v)
    }
    
    type data struct {
        Header *json.RawMessage `json:"header"`
        Body   string           `json:"body"`
        Mass   myFloat64        `json:"mass"`
    }
    
    func main() {
        h := json.RawMessage(`{"precomputed": true}`)
    
        for _, item := range []data{
                {
                        Header: &h,
                        Body:   "Hello Gophers!",
                        Mass:   1.0,
                },
                {
                        Header: &h,
                        Body:   "Holã Gophers!",
                        Mass:   1.42,
                },
        } {
                b, err := json.MarshalIndent(&item, "", "\t")
                if err != nil {
                        fmt.Println("error:", err)
                }
                os.Stdout.Write(b)
        }
    }
------------>8------------

Which outputs:

{
        "header": {
                "precomputed": true
        },
        "body": "Hello Gophers!",
        "mass": 1.0
}{
        "header": {
                "precomputed": true
        },
        "body": "Holã Gophers!",
        "mass": 1.42
}

I'm not truly sure about the usage of epsilon: maybe it's OK for your
case to just compare the fractional part with float64(0).

1. https://play.golang.org/p/d9cTkr70sJ

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to