| Safe Haskell | None |
|---|---|
| Language | Haskell98 |
Pipes.Aeson
Description
This module allows you to encode and decode JSON values flowing downstream through Pipes streams.
This module builds on top of the aeson, pipes and pipes-parse
libraries, and assumes you know how to use them. Please read the examples
in Pipes.Parse.Tutorial to understand how to use these functions.
In this module, the following type synonym compatible with the lens,
lens-family and lens-family-core libraries is used but not exported:
type Lens' s a = forall f . Functor f => (a -> f a) -> (s -> f s)
Synopsis
- encodeArray :: Monad m => Array -> Producer' ByteString m ()
- encodeObject :: Monad m => Object -> Producer' ByteString m ()
- decode :: (Monad m, FromJSON a) => Parser ByteString m (Maybe (Either DecodingError a))
- decoded :: (Monad m, FromJSON a, ToJSON a) => (Value -> Either Object Array) -> Lens' (Producer ByteString m r) (Producer a m (Either (DecodingError, Producer ByteString m r) r))
- decodeL :: (Monad m, FromJSON a) => Parser ByteString m (Maybe (Either DecodingError (Int, a)))
- decodedL :: (Monad m, FromJSON a, ToJSON a) => (Value -> Either Object Array) -> Lens' (Producer ByteString m r) (Producer (Int, a) m (Either (DecodingError, Producer ByteString m r) r))
- data DecodingError
- = AttoparsecError ParsingError
- | FromJSONError String
Encoding
Encode Array or Object values as JSON and send them downstream,
possibly in more than one ByteString chunk.
Note: The JSON RFC-4627 standard only allows arrays or objects as top-level
entities, which is why these functions restrict their input to them. If you
prefer to ignore the standard and encode any Value, then use encode
from the Pipes.Aeson.Unchecked module.
encodeArray :: Monad m => Array -> Producer' ByteString m () Source #
Encode an Array as JSON and send it downstream,
Hint: You can easily turn this Producer' into a Pipe that encodes
Array values as JSON as they flow downstream using:
forcatencodeArray::Monadm =>PipeArrayByteStringm r
encodeObject :: Monad m => Object -> Producer' ByteString m () Source #
Encode an Object as JSON and send it downstream,
Hint: You can easily turn this Producer' into a Pipe that encodes
Object values as JSON as they flow downstream using:
forcatencodeObject::Monadm =>PipeObjectByteStringm r
Decoding
Decoding JSON as a Haskell value involves two different steps:
- Parsing a raw JSON
ByteStringinto anObjector anArray. - Converting the obtained
ObjectorArrayto the desiredFromJSONinstance.
Any of those steps can fail, in which case a DecodingError will report
the precise error and at which step it happened.
decode :: (Monad m, FromJSON a) => Parser ByteString m (Maybe (Either DecodingError a)) Source #
Decodes an Object or Array JSON value from the underlying state.
It returns Nothing if the underlying Producer is exhausted, otherwise
it returns either the decoded entity or a DecodingError in case of error.
Note: The JSON RFC-4627 standard only allows arrays or objects as top-level
entities, which is why this Parser restricts its output to them. If
you prefer to ignore the standard and decode any Value, then use
decode from the Pipes.Aeson.Unchecked module.
Arguments
| :: (Monad m, FromJSON a, ToJSON a) | |
| => (Value -> Either Object Array) | A witness that |
| -> Lens' (Producer ByteString m r) (Producer a m (Either (DecodingError, Producer ByteString m r) r)) |
Improper lens that turns a stream of raw JSON input into a stream of
FromJSON and back.
By improper lens we mean that in practice you can't expect the
Monad Morphism Laws to be true when using decoded with
zoom.
zoomdecoded(returnr) /=returnrzoomdecoded(m >>= k) /=zoomm >>=zoom. f
Note: The JSON RFC-4627 standard only allows arrays or objects as top-level
entities, which is why this function restricts its stream values to them. If
you prefer to ignore the standard and encode or decode any Value, then
use decoded from the Pipes.Aeson.Unchecked module.
Including lengths
decodeL :: (Monad m, FromJSON a) => Parser ByteString m (Maybe (Either DecodingError (Int, a))) Source #
Like decode, except it also returns the length of JSON input that was
consumed in order to obtain the value, not including the length of whitespace
before nor after the parsed JSON input.
Arguments
| :: (Monad m, FromJSON a, ToJSON a) | |
| => (Value -> Either Object Array) | A witness that |
| -> Lens' (Producer ByteString m r) (Producer (Int, a) m (Either (DecodingError, Producer ByteString m r) r)) |
Like decoded, except it also tags each decoded entity with the length of
JSON input that was consumed in order to obtain the value, not including the
length of whitespace between each parsed JSON input.
Types
data DecodingError Source #
An error while decoding a JSON value.
Constructors
| AttoparsecError ParsingError | An |
| FromJSONError String | An |
Instances
| Eq DecodingError Source # | |
Defined in Pipes.Aeson.Internal | |
| Data DecodingError Source # | |
Defined in Pipes.Aeson.Internal Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> DecodingError -> c DecodingError gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c DecodingError toConstr :: DecodingError -> Constr dataTypeOf :: DecodingError -> DataType dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c DecodingError) dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c DecodingError) gmapT :: (forall b. Data b => b -> b) -> DecodingError -> DecodingError gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> DecodingError -> r gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> DecodingError -> r gmapQ :: (forall d. Data d => d -> u) -> DecodingError -> [u] gmapQi :: Int -> (forall d. Data d => d -> u) -> DecodingError -> u gmapM :: Monad m => (forall d. Data d => d -> m d) -> DecodingError -> m DecodingError gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> DecodingError -> m DecodingError gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> DecodingError -> m DecodingError | |
| Show DecodingError Source # | |
Defined in Pipes.Aeson.Internal Methods showsPrec :: Int -> DecodingError -> ShowS show :: DecodingError -> String showList :: [DecodingError] -> ShowS | |
| Exception DecodingError Source # | |
Defined in Pipes.Aeson.Internal Methods toException :: DecodingError -> SomeException fromException :: SomeException -> Maybe DecodingError displayException :: DecodingError -> String | |
| Error DecodingError Source # | |
Defined in Pipes.Aeson.Internal | |
| Error (DecodingError, Producer a m r) Source # | |
Defined in Pipes.Aeson.Internal | |