encoding/json: don't marshal special float values

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5500084
This commit is contained in:
Evan Shaw 2012-01-03 12:30:18 +11:00 committed by Andrew Gerrand
parent 38ff98b4c6
commit c20c09251c
2 changed files with 34 additions and 1 deletions

View file

@ -12,6 +12,7 @@ package json
import (
"bytes"
"encoding/base64"
"math"
"reflect"
"runtime"
"sort"
@ -170,6 +171,15 @@ func (e *UnsupportedTypeError) Error() string {
return "json: unsupported type: " + e.Type.String()
}
type UnsupportedValueError struct {
Value reflect.Value
Str string
}
func (e *UnsupportedValueError) Error() string {
return "json: unsupported value: " + e.Str
}
type InvalidUTF8Error struct {
S string
}
@ -290,7 +300,11 @@ func (e *encodeState) reflectValueQuoted(v reflect.Value, quoted bool) {
e.Write(b)
}
case reflect.Float32, reflect.Float64:
b := strconv.AppendFloat(e.scratch[:0], v.Float(), 'g', -1, v.Type().Bits())
f := v.Float()
if math.IsInf(f, 0) || math.IsNaN(f) {
e.error(&UnsupportedValueError{v, strconv.FormatFloat(f, 'g', -1, v.Type().Bits())})
}
b := strconv.AppendFloat(e.scratch[:0], f, 'g', -1, v.Type().Bits())
if quoted {
writeString(e, string(b))
} else {