2014-04-30 2 views
3

apes에서 반환 한 json을 구문 분석하기 위해 aeson을 사용하려고합니다. 응답은 wreq를 사용하여 API 엔드 포인트에서 반입됩니다.Aeson을 사용하여 문자열 디코드에 문제가 발생했습니다.

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

이 아마 인해 내하지 제대로 이해하는 텍스트 인코딩에 있지만, API가 반환되는 문자열이 실제로 유효한 JSON 아니라고 보인다 :이 문자열에 eitherDecode를 실행할 때 내가 얻을. 그렇다면 어떻게해야합니까? 어느 쪽이든, 나는 올바른 방향으로 나를 가리키는 누군가 주셔서 감사합니다!

나는 내 문제를 재현하는 예제를 포함 시켰습니다.

{-# 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 

답변

3

API 끝점에서 UTF-8이 아닌 ISO-8859-1이 반환 될 수 있습니다. 그런 다음 \163은 £ (파운드) 기호로 변환됩니다. 따라서 text-icu 패키지를 사용하여 ByteStringText 번인 convert 번으로 보낸 다음 Aeson에 제공하는 것이 좋습니다. 데이터를 얻기 위해 HTTP를 말하면 응답 헤더가 인코딩을 나타낼 수 있습니까?

+0

동일한 문제가 발생하여 답변을 보았습니다. 그러나 어떻게 Aeson에게 Text를 공급합니까? 어느 쪽 이건 ByteString이 원하는 것 같습니다 ... – gueux

관련 문제