diff --git a/pkg/jjson/json.go b/pkg/jjson/json.go index 5bda9600602bdae13d717ff047ffd8f3a16e679c..8d685b6946aa392c2db522ada7c6defd1d02e964 100644 --- a/pkg/jjson/json.go +++ b/pkg/jjson/json.go @@ -2,6 +2,7 @@ package jjson import ( "bytes" + "encoding/json" "io" jsoniter "github.com/json-iterator/go" @@ -29,26 +30,48 @@ func MarshalAndEncode(w io.Writer, v any) error { func Encode(w io.Writer, v any) error { s := jConfig.BorrowStream(w) defer jConfig.ReturnStream(s) - s.WriteVal(v) - return s.Flush() + switch cast := (v).(type) { + case func(e *jsoniter.Stream): + cast(s) + return s.Flush() + case json.Marshaler: + s.WriteVal(v) + return s.Flush() + case io.Reader: + _, err := io.Copy(w, cast) + if err != nil { + return err + } + return nil + default: + s.WriteVal(v) + return s.Flush() + } } func Decode(r io.Reader, v any) error { d := jConfig.NewDecoder(r) - return d.Decode(v) + switch cast := (v).(type) { + case json.Unmarshaler: + return d.Decode(v) + case io.Writer: + _, err := io.Copy(cast, r) + if err != nil { + return err + } + return nil + default: + return d.Decode(v) + } } func Unmarshal(xs []byte, v any) error { - d := jConfig.NewDecoder(bytes.NewBuffer(xs)) - return d.Decode(v) + return Decode(bytes.NewBuffer(xs), v) } func Marshal(v any) ([]byte, error) { out := &bytes.Buffer{} - s := jConfig.BorrowStream(out) - defer jConfig.ReturnStream(s) - s.WriteVal(v) - err := s.Flush() + err := Encode(out, v) if err != nil { return nil, err } diff --git a/pkg/jsonrpc/encode.go b/pkg/jsonrpc/encode.go index 7553ffff6a8360bea13ba75b09ae5454f6989f53..e7327c3ee757cc19de5b8e7e9c13baac222cd085 100644 --- a/pkg/jsonrpc/encode.go +++ b/pkg/jsonrpc/encode.go @@ -31,14 +31,6 @@ func EncodeObject(wr io.Writer, dat any) error { } } return nil - case json.Marshaler: - return jjson.Encode(wr, cast) - case io.Reader: - _, err := io.Copy(wr, cast) - if err != nil { - return err - } - return nil default: return jjson.Encode(wr, cast) }