我无法找到将 字符串 转换为 Data.ByteString.Lazy.Internal.ByteString
的函数或解决方法
Aeson Json 库中的函数之一是 decode
,其描述如下:
decode :: FromJSON a => bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString -> Maybe a
我试过在 Data.ByteString.Lazy.Char8 中使用 pack 函数,但它返回一个不同的 ByteString。有谁知道如何解决这个问题?
以下是我正在处理的示例:
import Data.Aeson
import Data.Text
import Control.Applicative
import Control.Monad (mzero)
import qualified Data.ByteString.Lazy.Internal as BLI
import qualified Data.ByteString.Lazy.Char8 as BSL
data Person = Person
{ name :: Text
, age :: Int
} deriving Show
instance FromJSON Person where
parseJSON (Object v) = Person <$>
v .: (pack "name") <*>
v .: (pack "age")
parseJSON _ = mzero
我尝试使用
decode (BSL.pack "{\"name\":\"Joe\",\"age\":12}") :: Maybe Person
并收到以下错误消息:Couldn't match expected type `bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString'
with actual type `BSL.ByteString'
In the return type of a call of `BSL.pack'
In the first argument of `decode', namely
`(BSL.pack "{\"name\":\"Joe\",\"age\":12}")'
In the expression:
decode (BSL.pack "{\"name\":\"Joe\",\"age\":12}") :: Maybe Person
帮助!
最佳答案
您需要使用 c2w(在 Data.ByteString.Internal 中)将 Char 转换为 Word8
Data.ByteString.Lazy.pack $ map c2w "abcd"
我还写出了 pack 的完全限定名称,以保证使用正确的名称,但您可以在导入部分中清理它。当我跑
> :t Data.ByteString.Lazy.pack $ map c2w "abcd"
我得到“:: Data.ByteString.Lazy.Internal.ByteString”
记住 Data.ByteString.Lazy 表示数值字符串(你甚至不能在字符串上运行它的包,你需要提供一个数字数组“包 [1,2,3,4]”),所以你实际上可能想要使用 char 等效的 Data.ByteString.Lazy.Char8。
关于Haskell Aeson JSON 库 ByteString 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20554022/