【问题标题】:Haskell Aeson JSON Library ByteString IssueHaskell Aeson JSON 库字节串问题
【发布时间】:2013-12-12 20:53:27
【问题描述】:

我无法找到将 String 转换为 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

救命!

【问题讨论】:

  • 您是否安装了多个版本的字节串?尝试运行ghc-pkg list bytestring 进行检查。
  • 该列表包含两个项目 bytestring-0.10.0.2 和 bytestring-.10.4.0 - 这会导致问题吗?我知道我之前在玩上面的代码时遇到了 GHCI 链接错误。
  • 是的,我必须取消注册 bytestring-10.4.0 才能让它工作。

标签: haskell aeson


【解决方案1】:

您需要使用 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。

【讨论】:

  • 我设法使用它获得了正确的类型。所以我得到了 Data.ByteString.Lazy.Internal.ByteString 但现在它要求 byteString-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString。嗯,我认为这可能是 bennofs 对原始帖子发表评论的问题,因为我有两个版本的字节串?
  • 很可能是版本问题,但请记住,即使在单个版本的库中,也有四个字节串 - strict/Word8、strict/Char8、lazy/Word8 和 strict/Char8。 ... 并且 pack 只能直接处理 Char8 版本的字符串。
  • Brilliant 遇到了另一个问题,即安装了两个字节串,如原帖评论中所述,该问题也已得到修复。谢谢!
【解决方案2】:

为方便起见,您还可以使用 fromString from Data.ByteString.Lazy.UTF8 from utf8-string

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多