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