| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | package jsonpbimport (	"bytes"	"encoding/json"	"reflect"	"github.com/gogo/protobuf/proto"	"github.com/golang/protobuf/jsonpb"	"github.com/go-kratos/kratos/v2/encoding")// Name is the name registered for the json codec.const Name = "jsonpb"var jsonpbMarshaler *jsonpb.Marshalerfunc init() {	jsonpbMarshaler = &jsonpb.Marshaler{		EnumsAsInts:  true,		EmitDefaults: true,		OrigName:     true,	}	encoding.RegisterCodec(codec{})}// codec is a Codec implementation with json.type codec struct{}func (codec) Marshal(v interface{}) ([]byte, error) {	if _, ok := v.(proto.Message); ok {		var buf bytes.Buffer		err := jsonpbMarshaler.Marshal(&buf, v.(proto.Message))		if err != nil {			return nil, err		}		return buf.Bytes(), nil	}	return json.Marshal(v)}func (codec) Unmarshal(data []byte, v interface{}) error {	rv := reflect.ValueOf(v)	for rv.Kind() == reflect.Ptr {		if rv.IsNil() && rv.CanInterface() {			rv.Set(reflect.New(rv.Type().Elem()))			v = rv.Interface()		}		rv = rv.Elem()	}	return json.Unmarshal(data, v)}func (codec) Name() string {	return Name}
 |