From 5f298fe6a1f608093138e403dd15fe9a3c72757b Mon Sep 17 00:00:00 2001 From: lhchavez Date: Wed, 4 Aug 2021 09:55:02 -0700 Subject: [PATCH] Homogenize treatment of params and meta in UnmarshalJSON (#52) This change makes the treatment of params and meta the same, by assigning a well-known pointer at first to detect if the unmarshaling process overwrites it with an explicit nil, or it stays the same in which it means that it was unset from the beginning. --- jsonrpc2.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/jsonrpc2.go b/jsonrpc2.go index e6e2251..7815c84 100644 --- a/jsonrpc2.go +++ b/jsonrpc2.go @@ -85,10 +85,12 @@ func (r Request) MarshalJSON() ([]byte, error) { func (r *Request) UnmarshalJSON(data []byte) error { r2 := make(map[string]interface{}) - // Detect if the "params" field is JSON "null" or just not present - // by seeing if the field gets overwritten to nil. + // Detect if the "params" or "meta" fields are JSON "null" or just not + // present by seeing if the field gets overwritten to nil. emptyParams := &json.RawMessage{} r2["params"] = emptyParams + emptyMeta := &json.RawMessage{} + r2["meta"] = emptyMeta decoder := json.NewDecoder(bytes.NewReader(data)) decoder.UseNumber() @@ -112,9 +114,13 @@ func (r *Request) UnmarshalJSON(data []byte) error { } r.Params = (*json.RawMessage)(&b) } - meta, ok := r2["meta"] - if ok { - b, err := json.Marshal(meta) + switch { + case r2["meta"] == nil: + r.Meta = &jsonNull + case r2["meta"] == emptyMeta: + r.Meta = nil + default: + b, err := json.Marshal(r2["meta"]) if err != nil { return fmt.Errorf("failed to marshal Meta: %w", err) }