【问题标题】:Trouble using Aeson to decode string使用 Aeson 解码字符串时遇到问题
【发布时间】:2014-05-01 07:15:10
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: json haskell aeson


    【解决方案1】:

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

    【讨论】:

    • 我遇到了同样的问题并看到了您接受的答案。但是如何将文本提供给 Aeson?要么解码似乎想要 ByteString...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多