|
2 | 2 | package jwriter |
3 | 3 |
|
4 | 4 | import ( |
| 5 | + "fmt" |
5 | 6 | "io" |
| 7 | + "math" |
6 | 8 | "strconv" |
7 | 9 | "unicode/utf8" |
8 | 10 |
|
@@ -248,23 +250,39 @@ func (w *Writer) Int64Str(n int64) { |
248 | 250 | } |
249 | 251 |
|
250 | 252 | func (w *Writer) Float32(n float32) { |
| 253 | + if w.checkIsUnsupportedFloat(float64(n)) { |
| 254 | + return |
| 255 | + } |
| 256 | + |
251 | 257 | w.Buffer.EnsureSpace(20) |
252 | 258 | w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) |
253 | 259 | } |
254 | 260 |
|
255 | 261 | func (w *Writer) Float32Str(n float32) { |
| 262 | + if w.checkIsUnsupportedFloat(float64(n)) { |
| 263 | + return |
| 264 | + } |
| 265 | + |
256 | 266 | w.Buffer.EnsureSpace(20) |
257 | 267 | w.Buffer.Buf = append(w.Buffer.Buf, '"') |
258 | 268 | w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) |
259 | 269 | w.Buffer.Buf = append(w.Buffer.Buf, '"') |
260 | 270 | } |
261 | 271 |
|
262 | 272 | func (w *Writer) Float64(n float64) { |
| 273 | + if w.checkIsUnsupportedFloat(n) { |
| 274 | + return |
| 275 | + } |
| 276 | + |
263 | 277 | w.Buffer.EnsureSpace(20) |
264 | 278 | w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, n, 'g', -1, 64) |
265 | 279 | } |
266 | 280 |
|
267 | 281 | func (w *Writer) Float64Str(n float64) { |
| 282 | + if w.checkIsUnsupportedFloat(n) { |
| 283 | + return |
| 284 | + } |
| 285 | + |
268 | 286 | w.Buffer.EnsureSpace(20) |
269 | 287 | w.Buffer.Buf = append(w.Buffer.Buf, '"') |
270 | 288 | w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 64) |
@@ -415,3 +433,12 @@ func (w *Writer) base64(in []byte) { |
415 | 433 | w.Buffer.Buf = append(w.Buffer.Buf, byte(padChar), byte(padChar)) |
416 | 434 | } |
417 | 435 | } |
| 436 | + |
| 437 | +func (w *Writer) checkIsUnsupportedFloat(val float64) bool { |
| 438 | + isUnsupported := math.IsNaN(val) || math.IsInf(val, 0) |
| 439 | + if isUnsupported && w.Error == nil { |
| 440 | + w.Error = fmt.Errorf("json: unsupported value: %v", val) |
| 441 | + } |
| 442 | + |
| 443 | + return isUnsupported |
| 444 | +} |
0 commit comments