@@ -3,6 +3,7 @@ package scanner
33import (
44 "bytes"
55 "database/sql"
6+ "encoding/json"
67 "fmt"
78 "io"
89 "math"
@@ -717,6 +718,7 @@ func (s *scanner) trySetByteArray(v interface{}, optional bool, def bool) bool {
717718 return true
718719}
719720
721+ // nolint: gocyclo
720722func (s * scanner ) scanRequired (value interface {}) {
721723 switch v := value .(type ) {
722724 case * bool :
@@ -771,6 +773,19 @@ func (s *scanner) scanRequired(value interface{}) {
771773 if err != nil {
772774 _ = s .errorf (0 , "sql.Scanner error: %w" , err )
773775 }
776+ case json.Unmarshaler :
777+ var err error
778+ switch s .getType () {
779+ case types .TypeJSON :
780+ err = v .UnmarshalJSON (s .converter .JSON ())
781+ case types .TypeJSONDocument :
782+ err = v .UnmarshalJSON (s .converter .JSONDocument ())
783+ default :
784+ _ = s .errorf (0 , "ydb required type %T not unsupported for applying to json.Unmarshaler" , s .getType ())
785+ }
786+ if err != nil {
787+ _ = s .errorf (0 , "json.Unmarshaler error: %w" , err )
788+ }
774789 default :
775790 ok := s .trySetByteArray (v , false , false )
776791 if ! ok {
@@ -949,6 +964,20 @@ func (s *scanner) scanOptional(value interface{}, defaultValueForOptional bool)
949964 if err != nil {
950965 _ = s .errorf (0 , "sql.Scanner error: %w" , err )
951966 }
967+ case json.Unmarshaler :
968+ s .unwrap ()
969+ var err error
970+ switch s .getType () {
971+ case types .TypeJSON :
972+ err = v .UnmarshalJSON (s .converter .JSON ())
973+ case types .TypeJSONDocument :
974+ err = v .UnmarshalJSON (s .converter .JSONDocument ())
975+ default :
976+ _ = s .errorf (0 , "ydb optional type %T not unsupported for applying to json.Unmarshaler" , s .getType ())
977+ }
978+ if err != nil {
979+ _ = s .errorf (0 , "json.Unmarshaler error: %w" , err )
980+ }
952981 default :
953982 s .unwrap ()
954983 ok := s .trySetByteArray (v , true , false )
@@ -1013,6 +1042,11 @@ func (s *scanner) setDefaultValue(dst interface{}) {
10131042 if err != nil {
10141043 _ = s .errorf (0 , "ydb.Scanner error: %w" , err )
10151044 }
1045+ case json.Unmarshaler :
1046+ err := v .UnmarshalJSON (nil )
1047+ if err != nil {
1048+ _ = s .errorf (0 , "json.Unmarshaler error: %w" , err )
1049+ }
10161050 default :
10171051 ok := s .trySetByteArray (v , false , true )
10181052 if ! ok {
0 commit comments