You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.0 KiB
54 lines
1.0 KiB
6 years ago
|
package codec
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/json"
|
||
|
|
||
|
"github.com/gogo/protobuf/jsonpb"
|
||
|
"github.com/gogo/protobuf/proto"
|
||
|
"google.golang.org/grpc/encoding"
|
||
|
)
|
||
|
|
||
|
//Reference https://jbrandhorst.com/post/grpc-json/
|
||
|
func init() {
|
||
|
encoding.RegisterCodec(JSON{
|
||
|
Marshaler: jsonpb.Marshaler{
|
||
|
EmitDefaults: true,
|
||
|
OrigName: true,
|
||
|
},
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// JSON is impl of encoding.Codec
|
||
|
type JSON struct {
|
||
|
jsonpb.Marshaler
|
||
|
jsonpb.Unmarshaler
|
||
|
}
|
||
|
|
||
|
// Name is name of JSON
|
||
|
func (j JSON) Name() string {
|
||
|
return "json"
|
||
|
}
|
||
|
|
||
|
// Marshal is json marshal
|
||
|
func (j JSON) Marshal(v interface{}) (out []byte, err error) {
|
||
|
if pm, ok := v.(proto.Message); ok {
|
||
|
b := new(bytes.Buffer)
|
||
|
err := j.Marshaler.Marshal(b, pm)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return b.Bytes(), nil
|
||
|
}
|
||
|
return json.Marshal(v)
|
||
|
}
|
||
|
|
||
|
// Unmarshal is json unmarshal
|
||
|
func (j JSON) Unmarshal(data []byte, v interface{}) (err error) {
|
||
|
if pm, ok := v.(proto.Message); ok {
|
||
|
b := bytes.NewBuffer(data)
|
||
|
return j.Unmarshaler.Unmarshal(b, pm)
|
||
|
}
|
||
|
return json.Unmarshal(data, v)
|
||
|
}
|