3

我无法找到将字符串转换为的函数或解决方法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

帮助!

4

2 回答 2

5

您需要使用 c2w 将 Char 转换为 Word8(在 Data.ByteString.Internal 中)

Data.ByteString.Lazy.pack $ map c2w "abcd"

我还写出了 pack 的完全限定名称,以保证使用正确的名称,但您可以在导入部分中清除它。当我跑

> :t Data.ByteString.Lazy.pack $ map c2w "abcd"

我得到“:: Data.ByteString.Lazy.Internal.ByteString”

请记住,Data.ByteString.Lazy 表示数字值的字符串(您甚至不能在字符串上运行它的包,您需要提供一个数字数组“pack [1, 2, 3, 4]”),因此您实际上可能想使用 char 等效的 Data.ByteString.Lazy.Char8。

于 2013-12-12T21:35:10.073 回答
0

您也可以从fromStringutf8 -string使用方便。Data.ByteString.Lazy.UTF8

它是与 aeson 使用的相同 ByteString 类型的函数模块。它依赖 UTF8 作为缓冲区中使用的编码。

于 2015-03-30T02:01:50.580 回答