1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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)
- }
|