diff --git a/pkg/jsonrpc/jrpc.go b/pkg/jsonrpc/conn.go
similarity index 62%
rename from pkg/jsonrpc/jrpc.go
rename to pkg/jsonrpc/conn.go
index c7cb6db238eb40eca84eb59f198920e3f9d8d44f..8bed1b0a6e4f1f9f04595ff3b7474c1fc39e4d50 100644
--- a/pkg/jsonrpc/jrpc.go
+++ b/pkg/jsonrpc/conn.go
@@ -5,16 +5,19 @@ import (
 	"io"
 )
 
-// http.handler, but for jrpc
-type Handler interface {
-	ServeRPC(w ResponseWriter, r *Request)
-}
+type Conn interface {
+	Doer
+	BatchCaller
 
-// http.HandlerFunc,but for jrpc
-type HandlerFunc func(w ResponseWriter, r *Request)
+	Mounter
 
-func (fn HandlerFunc) ServeRPC(w ResponseWriter, r *Request) {
-	(fn)(w, r)
+	io.Closer
+	Closed() <-chan struct{}
+}
+
+type StreamingConn interface {
+	Conn
+	Notifier
 }
 
 type Doer interface {
@@ -32,22 +35,3 @@ type Notifier interface {
 type Mounter interface {
 	Mount(Middleware)
 }
-
-type Closeder interface {
-	Closed() <-chan struct{}
-}
-
-type Conn interface {
-	Doer
-	BatchCaller
-
-	Mounter
-
-	io.Closer
-	Closeder
-}
-
-type StreamingConn interface {
-	Conn
-	Notifier
-}
diff --git a/pkg/jsonrpc/dummy.go b/pkg/jsonrpc/conn_dummy.go
similarity index 100%
rename from pkg/jsonrpc/dummy.go
rename to pkg/jsonrpc/conn_dummy.go
diff --git a/pkg/jsonrpc/helper.go b/pkg/jsonrpc/conn_helpers.go
similarity index 100%
rename from pkg/jsonrpc/helper.go
rename to pkg/jsonrpc/conn_helpers.go
diff --git a/pkg/jsonrpc/context.go b/pkg/jsonrpc/context.go
index 9187fc1c64a395e804a48e562facdd8bf4dd44b1..758693b5a6b5e19b7cf6b7abe76835a187346cbf 100644
--- a/pkg/jsonrpc/context.go
+++ b/pkg/jsonrpc/context.go
@@ -16,8 +16,3 @@ func ConnFromContext(ctx context.Context) (Conn, bool) {
 	client, ok := ctx.Value(clientContextKey{}).(Conn)
 	return client, ok
 }
-
-func StreamingConnFromContext(ctx context.Context) (StreamingConn, bool) {
-	client, ok := ctx.Value(clientContextKey{}).(StreamingConn)
-	return client, ok
-}
diff --git a/pkg/jsonrpc/handler.go b/pkg/jsonrpc/handler.go
new file mode 100644
index 0000000000000000000000000000000000000000..799a980e086c190c3e798fb86f6a1e2b6bf8ee47
--- /dev/null
+++ b/pkg/jsonrpc/handler.go
@@ -0,0 +1,17 @@
+package jsonrpc
+
+// http.handler, but for jrpc
+type Handler interface {
+	ServeRPC(w ResponseWriter, r *Request)
+}
+
+// type check for handlerfunc
+var _ Handler = (HandlerFunc)(nil)
+
+// http.HandlerFunc,but for jrpc
+type HandlerFunc func(w ResponseWriter, r *Request)
+
+// ServeRPC implements (jsonrpc.Handler).ServeRPC
+func (fn HandlerFunc) ServeRPC(w ResponseWriter, r *Request) {
+	(fn)(w, r)
+}
diff --git a/pkg/jsonrpc/json.go b/pkg/jsonrpc/json.go
index 5935de73df342a01bf639cef4c7e68bf2e1a4244..4ab13f3d9e1837893b9f51da14e20da054a50c40 100644
--- a/pkg/jsonrpc/json.go
+++ b/pkg/jsonrpc/json.go
@@ -36,7 +36,7 @@ func NewStringReader(x string) io.ReadCloser {
 	return io.NopCloser(strings.NewReader(x))
 }
 
-func MarshalMessage(m *Message, enc *jx.Encoder) error {
+func MarshalMessage(m *Message, enc *jx.Encoder) (err error) {
 	// use encoder
 	fail := enc.Obj(func(e *jx.Encoder) {
 		e.Field("jsonrpc", func(e *jx.Encoder) {
@@ -68,12 +68,19 @@ func MarshalMessage(m *Message, enc *jx.Encoder) error {
 				e.Raw(m.Params)
 			})
 		}
-		if m.Result != nil {
+		if m.Result != nil && err == nil {
 			e.Field("result", func(e *jx.Encoder) {
-				io.Copy(e, m.Result)
+				var n int64
+				n, err = io.Copy(e, m.Result)
+				if n == 0 {
+					e.Null()
+				}
 			})
 		}
 	})
+	if err != nil {
+		return err
+	}
 	if fail {
 		return fmt.Errorf("jx encoding error")
 	}