Проблемы с использованием Aeson для декодирования строки

Я пытаюсь использовать aeson для анализа json, возвращаемого API. Ответ извлекается из конечной точки API с помощью wreq. При запуске любого декодирования в этой строке я получаю:

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

person oneway    schedule 30.04.2014    source источник


Ответы (1)


Возможно, ваша конечная точка API возвращает не UTF-8, а ISO-8859-1. Тогда \163 будет переводиться в символ £ (фунт), что имеет смысл, учитывая контекст. Поэтому я бы рекомендовал использовать пакет text-icu для преобразовать ваши входящие ByteString в Text и передать это Эсону. Если вы используете HTTP для получения данных, возможно, заголовки ответа указывают на кодировку?

person Waldheinz    schedule 30.04.2014
comment
Я столкнулся с той же проблемой и увидел ваш принятый ответ. Но как передать текст Эсону? либо Decode, кажется, хочет ByteString... - person gueux; 06.09.2016