From c1e5b1c17be31dfc8b2a558de92e059c23e4f58c Mon Sep 17 00:00:00 2001 From: longxboy Date: Wed, 26 May 2021 14:45:12 +0800 Subject: [PATCH] add protojson (#952) --- encoding/json/json.go | 21 +++++++++++++++++++++ examples/proto/echo_service_test.go | 1 + 2 files changed, 22 insertions(+) diff --git a/encoding/json/json.go b/encoding/json/json.go index 97efdc247..826b688e6 100644 --- a/encoding/json/json.go +++ b/encoding/json/json.go @@ -5,11 +5,24 @@ import ( "reflect" "github.com/go-kratos/kratos/v2/encoding" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" ) // Name is the name registered for the json codec. const Name = "json" +var ( + // MarshalOptions is a configurable JSON format marshaler. + MarshalOptions = protojson.MarshalOptions{ + EmitUnpopulated: true, + } + // UnmarshalOptions is a configurable JSON format parser. + UnmarshalOptions = protojson.UnmarshalOptions{ + DiscardUnknown: true, + } +) + func init() { encoding.RegisterCodec(codec{}) } @@ -18,6 +31,9 @@ func init() { type codec struct{} func (codec) Marshal(v interface{}) ([]byte, error) { + if m, ok := v.(proto.Message); ok { + return MarshalOptions.Marshal(m) + } return json.Marshal(v) } @@ -29,6 +45,11 @@ func (codec) Unmarshal(data []byte, v interface{}) error { } rv = rv.Elem() } + if m, ok := v.(proto.Message); ok { + return UnmarshalOptions.Unmarshal(data, m) + } else if m, ok := reflect.Indirect(reflect.ValueOf(v)).Interface().(proto.Message); ok { + return UnmarshalOptions.Unmarshal(data, m) + } return json.Unmarshal(data, v) } diff --git a/examples/proto/echo_service_test.go b/examples/proto/echo_service_test.go index 555867fb2..40373850a 100644 --- a/examples/proto/echo_service_test.go +++ b/examples/proto/echo_service_test.go @@ -134,6 +134,7 @@ func testEchoClient(t *testing.T, addr string) { if din.Body.ValueField.GetStringValue() != dout.Body.ValueField.GetStringValue() { t.Fatalf("EchoPatch expected %s got %s", din, dout) } + fmt.Println("echo test success!") } func TestJSON(t *testing.T) {