From 56bb801c8a4fdb3b3cda295fd2766d87834c455d Mon Sep 17 00:00:00 2001 From: Long Le Date: Tue, 11 Apr 2023 10:17:44 +0700 Subject: [PATCH] Use json.Number when scan to JSONMap (#202) * Use json.Number when scan to JSONMap * Add unittest for scanning JSONMap using json.Decoder.UseNumber --- json_map.go | 6 +++++- json_map_test.go | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/json_map.go b/json_map.go index 7845758..cc6a022 100644 --- a/json_map.go +++ b/json_map.go @@ -1,6 +1,7 @@ package datatypes import ( + "bytes" "context" "database/sql/driver" "encoding/json" @@ -42,7 +43,10 @@ func (m *JSONMap) Scan(val interface{}) error { return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", val)) } t := map[string]interface{}{} - err := json.Unmarshal(ba, &t) + rd := bytes.NewReader(ba) + decoder := json.NewDecoder(rd) + decoder.UseNumber() + err := decoder.Decode(&t) *m = t return err } diff --git a/json_map_test.go b/json_map_test.go index 93f4ee2..65c3e0b 100644 --- a/json_map_test.go +++ b/json_map_test.go @@ -172,3 +172,13 @@ func TestJSONMap(t *testing.T) { } } } + +func TestJSONMap_Scan(t *testing.T) { + content := `{"user_id": 1085238870184050699, "name": "Name of user"}` + obj := make(datatypes.JSONMap) + err := obj.Scan([]byte(content)) + if err != nil { + t.Fatalf("decode error %v", err) + } + AssertEqual(t, obj["user_id"], 1085238870184050699) +}