Forráskód Böngészése

调整json解析库

dcsunny 4 éve
szülő
commit
fdf4190ccd
5 módosított fájl, 62 hozzáadás és 2 törlés
  1. 3 1
      common/json.go
  2. 1 0
      go.mod
  3. 6 0
      go.sum
  4. 39 0
      http/encoding/json/json.go
  5. 13 1
      http/handle.go

+ 3 - 1
common/json.go

@@ -1,11 +1,13 @@
 package common
 
 import (
-	"encoding/json"
+	jsoniter "git.ikuban.com/server/json"
 
 	"google.golang.org/protobuf/types/known/structpb"
 )
 
+var json = jsoniter.ConfigCompatibleWithStandardLibrary
+
 func MarshalJSON(v interface{}) []byte {
 	j, _ := json.Marshal(v)
 	return j

+ 1 - 0
go.mod

@@ -3,6 +3,7 @@ module git.ikuban.com/server/kratos-utils
 go 1.16
 
 require (
+	git.ikuban.com/server/json v0.0.0-20210408053838-50ac5ceda83a // indirect
 	github.com/dcsunny/gocrypt v0.0.0-20200828060317-4dec5212cc15
 	github.com/dcsunny/mwt v0.0.0-20210128034911-2f50006077f5
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible

+ 6 - 0
go.sum

@@ -1,4 +1,6 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+git.ikuban.com/server/json v0.0.0-20210408053838-50ac5ceda83a h1:2OcIUm+cnO7dbUNPxoylWFkNizpeLI1RxiV4jVHSDbc=
+git.ikuban.com/server/json v0.0.0-20210408053838-50ac5ceda83a/go.mod h1:tRbbUpdE5PLoYhhkgt+XjE4RiydCsgm2r/Vjq/LtZic=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -63,6 +65,10 @@ github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFe
 github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
 github.com/lestrrat-go/pdebug/v3 v3.0.1 h1:3G5sX/aw/TbMTtVc9U7IHBWRZtMvwvBziF1e4HoQtv8=
 github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=

+ 39 - 0
http/encoding/json/json.go

@@ -0,0 +1,39 @@
+package json
+
+import (
+	"github.com/go-kratos/kratos/v2/encoding"
+
+	jsoniter "git.ikuban.com/server/json"
+)
+
+var json = jsoniter.ConfigCompatibleWithStandardLibrary
+
+// Name is the name registered for the json codec.
+const Name = "json"
+
+func init() {
+	encoding.RegisterCodec(codec{})
+}
+
+// codec is a Codec implementation with json.
+type codec struct{}
+
+func (codec) Marshal(v interface{}) ([]byte, error) {
+	return json.Marshal(v)
+}
+
+func (codec) Unmarshal(data []byte, v interface{}) error {
+	//rv := reflect.ValueOf(v)
+	//for rv.Kind() == reflect.Ptr {
+	//	if rv.IsNil() && rv.CanInterface() {
+	//		rv.Set(reflect.New(rv.Type().Elem()))
+	//		v = rv.Interface()
+	//	}
+	//	rv = rv.Elem()
+	//}
+	return json.Unmarshal(data, v)
+}
+
+func (codec) Name() string {
+	return Name
+}

+ 13 - 1
http/handle.go

@@ -11,7 +11,7 @@ import (
 	"github.com/go-kratos/kratos/v2/encoding"
 	"github.com/go-kratos/kratos/v2/errors"
 
-	"github.com/go-kratos/kratos/v2/encoding/json"
+	"git.ikuban.com/server/kratos-utils/http/encoding/json"
 	_ "github.com/go-kratos/kratos/v2/encoding/proto"
 )
 
@@ -34,6 +34,18 @@ func DecodeRequest(req *http.Request, v interface{}) error {
 	return binding.BindForm(req, v)
 }
 
+// encodeResponse encodes the object to the HTTP response.
+func EncodeResponse(w http.ResponseWriter, r *http.Request, v interface{}) error {
+	codec := codecForRequest(r)
+	data, err := codec.Marshal(v)
+	if err != nil {
+		return err
+	}
+	w.Header().Set(ContentTypeHeader, contentType(codec.Name()))
+	_, _ = w.Write(data)
+	return nil
+}
+
 func ErrHandle(w http.ResponseWriter, r *http.Request, err error) {
 	se, ok := errors.FromError(err)
 	if !ok {