import (
"cmp"
+ "math"
"reflect"
"strconv"
case string:
return enc.WriteToken(jsontext.String(val))
case float64:
+ if math.IsNaN(val) || math.IsInf(val, 0) {
+ break // use default logic below
+ }
return enc.WriteToken(jsontext.Float(val))
case map[string]any:
return marshalObjectAny(enc, val, mo)
case []any:
return marshalArrayAny(enc, val, mo)
- default:
- v := newAddressableValue(reflect.TypeOf(val))
- v.Set(reflect.ValueOf(val))
- marshal := lookupArshaler(v.Type()).marshal
- if mo.Marshalers != nil {
- marshal, _ = mo.Marshalers.(*Marshalers).lookup(marshal, v.Type())
- }
- return marshal(enc, v, mo)
}
+
+ v := newAddressableValue(reflect.TypeOf(val))
+ v.Set(reflect.ValueOf(val))
+ marshal := lookupArshaler(v.Type()).marshal
+ if mo.Marshalers != nil {
+ marshal, _ = mo.Marshalers.(*Marshalers).lookup(marshal, v.Type())
+ }
+ return marshal(enc, v, mo)
}
// unmarshalValueAny unmarshals a JSON value as a Go any.
},
in: struct{ X any }{[8]byte{}},
want: `{"X":"called"}`,
+ }, {
+ name: jsontest.Name("Interfaces/Any/Float/NaN"),
+ in: struct{ X any }{math.NaN()},
+ want: `{"X"`,
+ wantErr: EM(fmt.Errorf("unsupported value: %v", math.NaN())).withType(0, reflect.TypeFor[float64]()).withPos(`{"X":`, "/X"),
}, {
name: jsontest.Name("Interfaces/Any/Maps/Nil"),
in: struct{ X any }{map[string]any(nil)},