parseJson
необходимо вернуть значение типа Parser B.ByteString
, поэтому вам просто нужно вызвать pure
для возвращаемого значения B64.decode
.
import Control.Monad
-- Generalized to any MonadPlus instance, not just Either String
textToByteString :: MonadPlus m => T.Text -> m B.ByteString
textToByteString = case B64.decode (E.encodeUtf8 x) of
Left _ -> mzero
Right bs -> pure bs
instance J.FromJSON B.ByteString where
parseJSON (J.String x) = textToByteString x
parseJSON _ = mzero
Здесь я выбралвозвращать mzero
оба, если вы пытаетесь декодировать что-либо, кроме строки JSON, и если есть проблема с декодированием base-64.
Аналогично, toJSON
нужно просто кодировать Text
значение, которое вы создаете из закодированной в Base64 ByteString.
instance J.ToJSON B.ByteString where
toJSON = J.toJSON . byteStringToText
Возможно, вы захотите использовать оболочку нового типа вместо определения экземпляров ToJSON
и FromJSON
для B.ByteString
напрямую.