diff --git a/codecs/__init__.pxd b/codecs/__init__.pxd index 924d8f9..2dbcbd3 100644 --- a/codecs/__init__.pxd +++ b/codecs/__init__.pxd @@ -9,6 +9,10 @@ cdef class CodecContext: cpdef get_text_codec(self) cdef is_encoding_utf8(self) + cpdef get_json_decoder(self) + cdef is_decoding_json(self) + cpdef get_json_encoder(self) + cdef is_encoding_json(self) ctypedef object (*encode_func)(CodecContext settings, diff --git a/codecs/context.pyx b/codecs/context.pyx index 7df5b23..216da2d 100644 --- a/codecs/context.pyx +++ b/codecs/context.pyx @@ -12,3 +12,15 @@ cdef class CodecContext: cdef is_encoding_utf8(self): raise NotImplementedError + + cpdef get_json_decoder(self): + raise NotImplementedError + + cdef is_decoding_json(self): + raise NotImplementedError + + cpdef get_json_encoder(self): + raise NotImplementedError + + cdef is_encoding_json(self): + raise NotImplementedError diff --git a/codecs/json.pyx b/codecs/json.pyx index d1b50a0..97e6916 100644 --- a/codecs/json.pyx +++ b/codecs/json.pyx @@ -10,6 +10,9 @@ cdef jsonb_encode(CodecContext settings, WriteBuffer buf, obj): char *str ssize_t size + if settings.is_encoding_json(): + obj = settings.get_json_encoder().encode(obj) + as_pg_string_and_size(settings, obj, &str, &size) if size > 0x7fffffff - 1: @@ -26,4 +29,29 @@ cdef jsonb_decode(CodecContext settings, FRBuffer *buf): if format != 1: raise ValueError('unexpected JSONB format: {}'.format(format)) - return text_decode(settings, buf) + rv = text_decode(settings, buf) + + if settings.is_decoding_json(): + rv = settings.get_json_decoder().decode(rv) + + return rv + + +cdef json_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + char *str + ssize_t size + + if settings.is_encoding_json(): + obj = settings.get_json_encoder().encode(obj) + + text_encode(settings, buf, obj) + + +cdef json_decode(CodecContext settings, FRBuffer *buf): + rv = text_decode(settings, buf) + + if settings.is_decoding_json(): + rv = settings.get_json_decoder().decode(rv) + + return rv