unmarshal json with jsonpb if accepter is pb
				
					
				
			This commit is contained in:
		| @@ -5,13 +5,16 @@ import ( | |||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"io" | 	"io" | ||||||
|  |  | ||||||
|  | 	"github.com/golang/protobuf/jsonpb" | ||||||
|  | 	"github.com/golang/protobuf/proto" | ||||||
| 	"github.com/micro/go-micro/codec" | 	"github.com/micro/go-micro/codec" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type Codec struct { | type Codec struct { | ||||||
| 	Conn    io.ReadWriteCloser | 	Conn        io.ReadWriteCloser | ||||||
| 	Encoder *json.Encoder | 	Encoder     *json.Encoder | ||||||
| 	Decoder *json.Decoder | 	Decoder     *json.Decoder | ||||||
|  | 	Unmarshaler *jsonpb.Unmarshaler | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Codec) ReadHeader(m *codec.Message, t codec.MessageType) error { | func (c *Codec) ReadHeader(m *codec.Message, t codec.MessageType) error { | ||||||
| @@ -22,6 +25,9 @@ func (c *Codec) ReadBody(b interface{}) error { | |||||||
| 	if b == nil { | 	if b == nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  | 	if pb, ok := b.(proto.Message); ok { | ||||||
|  | 		return c.Unmarshaler.UnmarshalNext(c.Decoder, pb) | ||||||
|  | 	} | ||||||
| 	return c.Decoder.Decode(b) | 	return c.Decoder.Decode(b) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -42,8 +48,9 @@ func (c *Codec) String() string { | |||||||
|  |  | ||||||
| func NewCodec(c io.ReadWriteCloser) codec.Codec { | func NewCodec(c io.ReadWriteCloser) codec.Codec { | ||||||
| 	return &Codec{ | 	return &Codec{ | ||||||
| 		Conn:    c, | 		Conn:        c, | ||||||
| 		Decoder: json.NewDecoder(c), | 		Decoder:     json.NewDecoder(c), | ||||||
| 		Encoder: json.NewEncoder(c), | 		Encoder:     json.NewEncoder(c), | ||||||
|  | 		Unmarshaler: &jsonpb.Unmarshaler{}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,6 +2,9 @@ package json | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  |  | ||||||
|  | 	"github.com/golang/protobuf/jsonpb" | ||||||
|  | 	"github.com/golang/protobuf/proto" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type Marshaler struct{} | type Marshaler struct{} | ||||||
| @@ -11,6 +14,9 @@ func (j Marshaler) Marshal(v interface{}) ([]byte, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (j Marshaler) Unmarshal(d []byte, v interface{}) error { | func (j Marshaler) Unmarshal(d []byte, v interface{}) error { | ||||||
|  | 	if pb, ok := v.(proto.Message); ok { | ||||||
|  | 		return jsonpb.UnmarshalString(string(d), pb) | ||||||
|  | 	} | ||||||
| 	return json.Unmarshal(d, v) | 	return json.Unmarshal(d, v) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user