Просмотр исходного кода

feat(binding): add UseNumber() in gin.Context.BindJSON() (#997) close #368

* resolve #368 add option to UseNumber() in gin.Context.BindJSON()

* add test
whirosan 8 лет назад
Родитель
Сommit
fb7448f081
3 измененных файлов с 18 добавлено и 1 удалено
  1. 7 1
      binding/json.go
  2. 4 0
      mode.go
  3. 7 0
      mode_test.go

+ 7 - 1
binding/json.go

@@ -10,7 +10,10 @@ import (
 	"github.com/json-iterator/go"
 )
 
-var json = jsoniter.ConfigCompatibleWithStandardLibrary
+var (
+	json                   = jsoniter.ConfigCompatibleWithStandardLibrary
+	EnableDecoderUseNumber = false
+)
 
 type jsonBinding struct{}
 
@@ -20,6 +23,9 @@ func (jsonBinding) Name() string {
 
 func (jsonBinding) Bind(req *http.Request, obj interface{}) error {
 	decoder := json.NewDecoder(req.Body)
+	if EnableDecoderUseNumber {
+		decoder.UseNumber()
+	}
 	if err := decoder.Decode(obj); err != nil {
 		return err
 	}

+ 4 - 0
mode.go

@@ -64,6 +64,10 @@ func DisableBindValidation() {
 	binding.Validator = nil
 }
 
+func EnableJsonDecoderUseNumber() {
+	binding.EnableDecoderUseNumber = true
+}
+
 func Mode() string {
 	return modeName
 }

+ 7 - 0
mode_test.go

@@ -8,6 +8,7 @@ import (
 	"os"
 	"testing"
 
+	"github.com/gin-gonic/gin/binding"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -34,3 +35,9 @@ func TestSetMode(t *testing.T) {
 
 	assert.Panics(t, func() { SetMode("unknown") })
 }
+
+func TestEnableJsonDecoderUseNumber(t *testing.T) {
+	assert.False(t, binding.EnableDecoderUseNumber)
+	EnableJsonDecoderUseNumber()
+	assert.True(t, binding.EnableDecoderUseNumber)
+}