diff --git a/pgtype/int2.go b/pgtype/int2.go index 3bcac63c..0cb6ef82 100644 --- a/pgtype/int2.go +++ b/pgtype/int2.go @@ -195,3 +195,16 @@ func (src Int2) Value() (driver.Value, error) { return nil, errUndefined } } + +func (src Int2) MarshalJSON() ([]byte, error) { + switch src.Status { + case Present: + return []byte(strconv.FormatInt(int64(src.Int), 10)), nil + case Null: + return []byte("null"), nil + case Undefined: + return []byte("undefined"), nil + } + + return nil, errBadStatus +} diff --git a/pgtype/int4.go b/pgtype/int4.go index 5069dab4..4a5bca51 100644 --- a/pgtype/int4.go +++ b/pgtype/int4.go @@ -186,3 +186,16 @@ func (src Int4) Value() (driver.Value, error) { return nil, errUndefined } } + +func (src Int4) MarshalJSON() ([]byte, error) { + switch src.Status { + case Present: + return []byte(strconv.FormatInt(int64(src.Int), 10)), nil + case Null: + return []byte("null"), nil + case Undefined: + return []byte("undefined"), nil + } + + return nil, errBadStatus +} diff --git a/pgtype/int8.go b/pgtype/int8.go index cf701dc6..0cc3545d 100644 --- a/pgtype/int8.go +++ b/pgtype/int8.go @@ -172,3 +172,16 @@ func (src Int8) Value() (driver.Value, error) { return nil, errUndefined } } + +func (src Int8) MarshalJSON() ([]byte, error) { + switch src.Status { + case Present: + return []byte(strconv.FormatInt(src.Int, 10)), nil + case Null: + return []byte("null"), nil + case Undefined: + return []byte("undefined"), nil + } + + return nil, errBadStatus +} diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index 338afc9b..27a1a091 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -129,6 +129,7 @@ type TextEncoder interface { } var errUndefined = errors.New("cannot encode status undefined") +var errBadStatus = errors.New("invalid status") type DataType struct { Value Value diff --git a/pgtype/text.go b/pgtype/text.go index 482c9023..62158b09 100644 --- a/pgtype/text.go +++ b/pgtype/text.go @@ -2,6 +2,7 @@ package pgtype import ( "database/sql/driver" + "encoding/json" "fmt" "io" ) @@ -134,3 +135,16 @@ func (src Text) Value() (driver.Value, error) { return nil, errUndefined } } + +func (src Text) MarshalJSON() ([]byte, error) { + switch src.Status { + case Present: + return json.Marshal(src.String) + case Null: + return []byte("null"), nil + case Undefined: + return []byte("undefined"), nil + } + + return nil, errBadStatus +} diff --git a/pgtype/varchar.go b/pgtype/varchar.go index f25ada5d..6c137b9a 100644 --- a/pgtype/varchar.go +++ b/pgtype/varchar.go @@ -49,3 +49,7 @@ func (dst *Varchar) Scan(src interface{}) error { func (src Varchar) Value() (driver.Value, error) { return (Text)(src).Value() } + +func (src Varchar) MarshalJSON() ([]byte, error) { + return (Text)(src).MarshalJSON() +}