mirror of
https://github.com/go-kratos/kratos.git
synced 2026-05-16 09:48:28 +02:00
+1
-6
@@ -7,9 +7,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-kratos/kratos/v2/encoding"
|
|
||||||
// init json encoder
|
|
||||||
_ "github.com/go-kratos/kratos/v2/encoding/json"
|
|
||||||
"github.com/go-kratos/kratos/v2/log"
|
"github.com/go-kratos/kratos/v2/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,8 +17,6 @@ var (
|
|||||||
ErrTypeAssert = errors.New("type assert error")
|
ErrTypeAssert = errors.New("type assert error")
|
||||||
|
|
||||||
_ Config = (*config)(nil)
|
_ Config = (*config)(nil)
|
||||||
|
|
||||||
codec = encoding.GetCodec("json")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Observer is config observer.
|
// Observer is config observer.
|
||||||
@@ -125,7 +120,7 @@ func (c *config) Scan(v interface{}) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return codec.Unmarshal(data, v)
|
return unmarshalJSON(data, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *config) Watch(key string, o Observer) error {
|
func (c *config) Watch(key string, o Observer) error {
|
||||||
|
|||||||
+20
-3
@@ -1,10 +1,13 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/imdario/mergo"
|
"github.com/imdario/mergo"
|
||||||
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Reader is config reader.
|
// Reader is config reader.
|
||||||
@@ -71,16 +74,16 @@ func (r *reader) Value(path string) (Value, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *reader) Source() ([]byte, error) {
|
func (r *reader) Source() ([]byte, error) {
|
||||||
return codec.Marshal(r.values)
|
return marshalJSON(r.values)
|
||||||
}
|
}
|
||||||
|
|
||||||
func cloneMap(src map[string]interface{}) (map[string]interface{}, error) {
|
func cloneMap(src map[string]interface{}) (map[string]interface{}, error) {
|
||||||
data, err := codec.Marshal(src)
|
data, err := marshalJSON(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
dst := make(map[string]interface{})
|
dst := make(map[string]interface{})
|
||||||
if err = codec.Unmarshal(data, &dst); err != nil {
|
if err = unmarshalJSON(data, &dst); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return dst, nil
|
return dst, nil
|
||||||
@@ -104,3 +107,17 @@ func convertMap(src interface{}) interface{} {
|
|||||||
return src
|
return src
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func marshalJSON(v interface{}) ([]byte, error) {
|
||||||
|
if m, ok := v.(proto.Message); ok {
|
||||||
|
return protojson.Marshal(m)
|
||||||
|
}
|
||||||
|
return json.Marshal(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmarshalJSON(data []byte, v interface{}) error {
|
||||||
|
if m, ok := v.(proto.Message); ok {
|
||||||
|
return protojson.Unmarshal(data, m)
|
||||||
|
}
|
||||||
|
return json.Unmarshal(data, v)
|
||||||
|
}
|
||||||
|
|||||||
+1
-21
@@ -5,25 +5,11 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/go-kratos/kratos/v2/encoding"
|
"github.com/go-kratos/kratos/v2/encoding"
|
||||||
|
|
||||||
"google.golang.org/protobuf/encoding/protojson"
|
|
||||||
"google.golang.org/protobuf/proto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Name is the name registered for the json codec.
|
// Name is the name registered for the json codec.
|
||||||
const Name = "json"
|
const Name = "json"
|
||||||
|
|
||||||
var (
|
|
||||||
// MarshalOptions is a configurable JSON format marshaler.
|
|
||||||
MarshalOptions = protojson.MarshalOptions{
|
|
||||||
EmitUnpopulated: true,
|
|
||||||
}
|
|
||||||
// UnmarshalOptions is a configurable JSON format parser.
|
|
||||||
UnmarshalOptions = protojson.UnmarshalOptions{
|
|
||||||
DiscardUnknown: true,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
encoding.RegisterCodec(codec{})
|
encoding.RegisterCodec(codec{})
|
||||||
}
|
}
|
||||||
@@ -32,24 +18,18 @@ func init() {
|
|||||||
type codec struct{}
|
type codec struct{}
|
||||||
|
|
||||||
func (codec) Marshal(v interface{}) ([]byte, error) {
|
func (codec) Marshal(v interface{}) ([]byte, error) {
|
||||||
if m, ok := v.(proto.Message); ok {
|
|
||||||
return MarshalOptions.Marshal(m)
|
|
||||||
}
|
|
||||||
return json.Marshal(v)
|
return json.Marshal(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (codec) Unmarshal(data []byte, v interface{}) error {
|
func (codec) Unmarshal(data []byte, v interface{}) error {
|
||||||
rv := reflect.ValueOf(v)
|
rv := reflect.ValueOf(v)
|
||||||
for rv.Kind() == reflect.Ptr {
|
for rv.Kind() == reflect.Ptr {
|
||||||
if rv.IsNil() {
|
if rv.IsNil() && rv.CanSet() {
|
||||||
rv.Set(reflect.New(rv.Type().Elem()))
|
rv.Set(reflect.New(rv.Type().Elem()))
|
||||||
v = rv.Interface()
|
v = rv.Interface()
|
||||||
}
|
}
|
||||||
rv = rv.Elem()
|
rv = rv.Elem()
|
||||||
}
|
}
|
||||||
if m, ok := v.(proto.Message); ok {
|
|
||||||
return UnmarshalOptions.Unmarshal(data, m)
|
|
||||||
}
|
|
||||||
return json.Unmarshal(data, v)
|
return json.Unmarshal(data, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user