[Haskell-beginners] Is it possible to "run" JSON Parser?

Baa aquagnu at gmail.com
Wed Aug 30 06:53:55 UTC 2017


Thank you, David. 1st way seems to be most close to my task. But from
your answers I see that actually no way to "run" Aeson Parser monad
except with ByteString argument (even not a direct "run"), right?

I check Aeson sources and IMHO no exporting functions to do it...

Anyway, thank you again!

> There are three ways to go about this.
> 
> Method one, we could turn all the Values into Maybe MyTypes.
> Method two, we could filter out any Value which cannot be turned into
> an MyType. Method three, we could fail to parse entirely if any Value
> cannot be turned into a MyType succesfully.
> 
> Here is some code that demonstrates all three approaches.
> 
> import Data.Aeson
> import Data.Aeson.Types (Parser)
> import Control.Monad
> import qualified Data.Text as T
> import Data.Maybe (catMaybes)
> 
> data Resp = Resp {
>   rHeadings :: [T.Text],
>   rows1 :: [Maybe MyType],
>   rows2 :: [MyType],
>   rows3 :: [MyType]
> }
> 
> data MyType = MyType
> 
> instance FromJSON Resp where
>   parseJSON = withObject "Resp" $ \v -> do
>     hds <- v .: "headings"
> 
> 
>     -- we could catch all of mytypes as maybes
>     r1 <- fmap f <$> v .: "rows" :: Parser [Maybe MyType]
> 
>     -- we could throw away values which can't be turned into MyType
>     r2 <- catMaybes . fmap f <$> v .: "rows" :: Parser [MyType]
> 
>     -- we could fail the parse entirely if any value fails.
>     r3 <- v .: "rows" >>= traverse f'
>     pure $ Resp hds r1 r2 r3
> 
> f :: Value -> Maybe MyType
> f v = undefined
> 
> f' :: Value -> Parser MyType
> f' (String t) = pure MyType
> f' (Bool t) = pure MyType
> f' (Number t) = pure MyType
> f' (Null) = pure MyType
>  -- Anything that is not one of the above will cause a failure of the
> entire parse.
> f' _ = mzero
> 
> On Tue, Aug 29, 2017 at 11:58 AM, Baa <aquagnu at gmail.com> wrote:
> > Hello List again! :)
> >
> > If I have a `FromJSON` instance, with `parseJSON` which translates
> > `Value` to MyType, how can I run this parser like I "run"
> > state/writer/reader monads? I mean not decoding of a bytestring
> > representation:
> >
> >   decode::ByteString -> Maybe MyType
> >
> > but
> >
> >   run::Value -> Maybe MyType
> >
> > The reason is that I have already collected Value's , and I have
> > parsers, so what is the problem, it would seem, to run parser on the
> > Value - to convert `Value` into `Maybe MyType`... Is it possible?
> >
> > ===
> > Best regards, Paul
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners  
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



More information about the Beginners mailing list