Skip to content

Commit

Permalink
Merge pull request #635 from molon/fix-tests
Browse files Browse the repository at this point in the history
encoding/json: Compatibility optimization
  • Loading branch information
taowen committed Sep 15, 2022
2 parents bf8b920 + 720cd42 commit 71ac162
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 13 deletions.
21 changes: 12 additions & 9 deletions reflect_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ package jsoniter

import (
"fmt"
"github.com/modern-go/reflect2"
"io"
"reflect"
"sort"
"unsafe"

"github.com/modern-go/reflect2"
)

func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder {
Expand Down Expand Up @@ -106,15 +107,17 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
}
}

if typ == textMarshalerType {
return &directTextMarshalerEncoder{
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
if typ.Kind() != reflect.String {
if typ == textMarshalerType {
return &directTextMarshalerEncoder{
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
}
}
}
if typ.Implements(textMarshalerType) {
return &textMarshalerEncoder{
valType: typ,
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
if typ.Implements(textMarshalerType) {
return &textMarshalerEncoder{
valType: typ,
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
}
}
}

Expand Down
16 changes: 16 additions & 0 deletions stream_float.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ func (stream *Stream) WriteFloat32(val float32) {
}
}
stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32)
if fmt == 'e' {
// clean up e-09 to e-9
n := len(stream.buf)
if n >= 4 && stream.buf[n-4] == 'e' && stream.buf[n-3] == '-' && stream.buf[n-2] == '0' {
stream.buf[n-2] = stream.buf[n-1]
stream.buf = stream.buf[:n-1]
}
}
}

// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster
Expand Down Expand Up @@ -76,6 +84,14 @@ func (stream *Stream) WriteFloat64(val float64) {
}
}
stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64)
if fmt == 'e' {
// clean up e-09 to e-9
n := len(stream.buf)
if n >= 4 && stream.buf[n-4] == 'e' && stream.buf[n-3] == '-' && stream.buf[n-2] == '0' {
stream.buf[n-2] = stream.buf[n-1]
stream.buf = stream.buf[:n-1]
}
}
}

// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster
Expand Down
9 changes: 5 additions & 4 deletions value_tests/float_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import (
"bytes"
"encoding/json"
"fmt"
"github.com/json-iterator/go"
"github.com/stretchr/testify/require"
"strconv"
"testing"

jsoniter "github.com/json-iterator/go"
"github.com/stretchr/testify/require"
)

func Test_read_float(t *testing.T) {
Expand Down Expand Up @@ -88,7 +89,7 @@ func Test_write_float32(t *testing.T) {

stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)
stream.WriteFloat32(float32(0.0000001))
should.Equal("1e-07", string(stream.Buffer()))
should.Equal("1e-7", string(stream.Buffer()))
}

func Test_write_float64(t *testing.T) {
Expand Down Expand Up @@ -125,5 +126,5 @@ func Test_write_float64(t *testing.T) {

stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)
stream.WriteFloat64(float64(0.0000001))
should.Equal("1e-07", string(stream.Buffer()))
should.Equal("1e-7", string(stream.Buffer()))
}

0 comments on commit 71ac162

Please sign in to comment.