无法使用Aeson解码字符串

时间:2014-04-30 21:53:53

标签: json haskell aeson

我试图使用aeson来解析api返回的json。使用wreq从api端点获取响应。当我在这个字符串上运行任一代码时,我得到:

Left "Failed reading: Cannot decode byte '\\xa3': Data.Text.Encoding.decodeUtf8: Invalid    UTF-8 stream"

这可能是由于我没有正确理解文本编码,但在我看来,api返回的字符串实际上并不是有效的json。如果是这样,我该怎么办?无论哪种方式,我都希望有人指出我正确的方向!

我添加了一个示例,可以在下面重现我的问题。

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Text
import GHC.Generics
import Data.ByteString.Lazy


data Test = Test { priceDescription ∷ Text } deriving (Show, Generic)

instance FromJSON Test

main = do
  let a = "\r\n{\r\n\"priceDescription\": \"\163\&5.98 each\"\r\n}" :: ByteString

  let result = eitherDecode a :: Either String Test
  print result

1 个答案:

答案 0 :(得分:3)

可能是您的API端点没有返回UTF-8,而是返回ISO-8859-1。然后\163将转换为£(磅)符号,这在上下文中是有意义的。因此,我建议您使用text-icu包来ByteString传入Text到{{1}},然后将其提供给Aeson。如果您正在说HTTP以获取数据,那么响应标头是否可以指示编码?