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.
53 lines
1.0 KiB
53 lines
1.0 KiB
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) |
|
}
|
|
|