我如何使用自定义 `parseJSON` 解码 JSON - 一个函数而不是与 `fromJSON` 的实例相关的函数?
How can I decode JSON using a custom `parseJSON` - a function rather than the function related to the instance for `fromJSON`?
这个函数:
eitherDecode :: FromJSON a => ByteString -> Either String a
有一个小限制,我不能有一个不是来自 FromJSON a
的解码的额外实现。
换句话说,我正在寻找一些方法来传递我自己的 Bytestring -> Either String a
解析函数。
好吧...所以我似乎必须为此定义自己的函数。
定义为:
-- | Like 'decode' but returns an error message when decoding fails.
eitherDecode :: (FromJSON a) => L.ByteString -> Either String a
eitherDecode = eitherFormatError . eitherDecodeWith jsonEOF ifromJSON
看起来像 ifrom
是我需要修改的定义为:
-- | Convert a value from JSON, failing if the types do not match.
ifromJSON :: (FromJSON a) => Value -> IResult a
ifromJSON = iparse parseJSON
好吧 eitherFormatError
不是从 Aeson 出口的,所以这基本上看起来我可能走错了路。
经过一些打字处理...
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module AesonExtra where
import Data.Aeson
import Data.Aeson.Types
import qualified Data.ByteString.Lazy as L
import qualified Data.HashMap.Strict as HashMap
import Data.Foldable (toList)
import Data.String.Conversions
import Data.Text (Text)
eitherDecodeCustom :: (Value -> Parser a) -> L.ByteString -> Either String a
eitherDecodeCustom f x = do
xx <- eitherDecode x :: Either String Value
parseEither f xx
这个函数:
eitherDecode :: FromJSON a => ByteString -> Either String a
有一个小限制,我不能有一个不是来自 FromJSON a
的解码的额外实现。
换句话说,我正在寻找一些方法来传递我自己的 Bytestring -> Either String a
解析函数。
好吧...所以我似乎必须为此定义自己的函数。
定义为:
-- | Like 'decode' but returns an error message when decoding fails.
eitherDecode :: (FromJSON a) => L.ByteString -> Either String a
eitherDecode = eitherFormatError . eitherDecodeWith jsonEOF ifromJSON
看起来像 ifrom
是我需要修改的定义为:
-- | Convert a value from JSON, failing if the types do not match.
ifromJSON :: (FromJSON a) => Value -> IResult a
ifromJSON = iparse parseJSON
好吧 eitherFormatError
不是从 Aeson 出口的,所以这基本上看起来我可能走错了路。
经过一些打字处理...
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module AesonExtra where
import Data.Aeson
import Data.Aeson.Types
import qualified Data.ByteString.Lazy as L
import qualified Data.HashMap.Strict as HashMap
import Data.Foldable (toList)
import Data.String.Conversions
import Data.Text (Text)
eitherDecodeCustom :: (Value -> Parser a) -> L.ByteString -> Either String a
eitherDecodeCustom f x = do
xx <- eitherDecode x :: Either String Value
parseEither f xx