From 1aca53985b43403118c2ccef13a5be939efba2c3 Mon Sep 17 00:00:00 2001 From: Louis Brauer Date: Thu, 7 Jun 2018 00:54:24 +0200 Subject: [PATCH] Adding json type for mssql dialect, similar to postgres.Jsonb --- dialects/mssql/mssql.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/dialects/mssql/mssql.go b/dialects/mssql/mssql.go index a8d3c45a..b03f8c22 100644 --- a/dialects/mssql/mssql.go +++ b/dialects/mssql/mssql.go @@ -1,6 +1,9 @@ package mssql import ( + "database/sql/driver" + "encoding/json" + "errors" "fmt" "reflect" "strconv" @@ -201,3 +204,25 @@ func currentDatabaseAndTable(dialect gorm.Dialect, tableName string) (string, st } return dialect.CurrentDatabase(), tableName } + +type Json struct { + json.RawMessage +} + +// Value get value of Jsonb +func (j Json) Value() (driver.Value, error) { + if len(j.RawMessage) == 0 { + return nil, nil + } + return j.MarshalJSON() +} + +// Scan scan value into Json +func (j *Json) Scan(value interface{}) error { + str, ok := value.(string) + if !ok { + return errors.New(fmt.Sprint("Failed to unmarshal JSONB value (strcast):", value)) + } + bytes := []byte(str) + return json.Unmarshal(bytes, j) +}