2013-12-12 4 views
3
나는이 문자열 아이손 JSON 라이브러리의 기능

하스켈 아이손 JSON 라이브러리 ByteString 문제

Data.ByteString.Lazy.Internal.ByteStringdecode입니다 변환하는 기능이나 해결 방법을 찾는 데 문제가 다음과 같은 설명이있어

:

decode :: FromJSON a => bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString -> Maybe a 

Data.ByteString.Lazy.Char8에서 pack 함수를 사용해 보았지만 다른 ByteString을 반환합니다. 어느 누구가이 문제를 해결할 수 있는지 알고 있습니까?

import Data.Aeson 
import Data.Text 
import Control.Applicative 
import Control.Monad (mzero) 
import qualified Data.ByteString.Lazy.Internal as BLI 
import qualified Data.ByteString.Lazy.Char8 as BSL 

data Person = Person 
    { name :: Text 
    , age :: Int 
    } deriving Show 

instance FromJSON Person where 
    parseJSON (Object v) = Person <$> 
        v .: (pack "name") <*> 
        v .: (pack "age") 
    parseJSON _   = mzero 

내가 decode (BSL.pack "{\"name\":\"Joe\",\"age\":12}") :: Maybe Person 를 사용하여 시도하고 다음과 같은 오류 메시지가 있어요 :

Couldn't match expected type `bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString' 
       with actual type `BSL.ByteString' 
    In the return type of a call of `BSL.pack' 
    In the first argument of `decode', namely 
     `(BSL.pack "{\"name\":\"Joe\",\"age\":12}")' 
    In the expression: 
     decode (BSL.pack "{\"name\":\"Joe\",\"age\":12}") :: Maybe Person 

도움말을

다음은 내가 일하고 있어요 예입니다!

+2

여러 버전의 바이트 테스트를 설치 했습니까? 확인을 위해'ghc-pkg list bytestring'을 실행 해보십시오. – bennofs

+0

목록에 bytestring-0.10.0.2와 bytestring-.10.4.0의 두 항목이 표시됩니다. 이로 인해 문제가 발생합니까? 나는 위의 코드로 놀고있을 때 이전에 GHCI 링크 오류가 있음을 알고있다. – MathanMV

+1

예, 작업을하기 위해 bytestring-10.4.0의 등록을 취소해야했습니다. – MathanMV

답변

5

당신은

Data.ByteString.Lazy.pack $ map c2w "abcd" 

내가 올바른 하나를 사용하여 보장도 팩의 완전한 이름을 썼다 (Data.ByteString.Internal에서) C2W를 사용 Word8에 숯불을 변환해야하지만,이를 정리할 수 있습니다 수입 섹션에서 내가

> :t Data.ByteString.Lazy.pack $ map c2w "abcd" 

를 실행하면 나는 (Data.ByteString.Lazy는 숫자 값의 문자열을 나타낸다는 것을 기억

":: Data.ByteString.Lazy.Internal.ByteString"를 얻을 당신은 심지어 팩을 실행할 수 없습니다 문자열의 경우 "pack [1, 2, 3, 4]"숫자 배열을 제공해야하므로 실제 동일한 Data.ByteString.Lazy.Char8을 사용하려고 할 수 있습니다.

+0

이것을 사용하여 올바른 유형을 얻을 수있었습니다. 그래서 나는 Data.ByteString.Lazy.Internal.ByteString을 얻었으나 이제 byteString-0.10.0.2 : Data.ByteString.Lazy.Internal.ByteString을 요구한다. 흠, 두 가지 버전의 바이트 태그가 있기 때문에 원래 게시물에 댓글이 달린 bennofs 문제 일 수 있다고 생각하십니까? – MathanMV

+0

버전 문제가있을 수 있지만 라이브러리의 단일 버전 내에서도 엄격한/Word8, 엄격한/Char8, 지연/Word8 및 엄격한/Char8 등의 4 가지 바이트 체크가 있으며 팩은 Char8 버전 용 문자열을 직접 작업하십시오. – jamshidh

+0

브릴리언트에는 설치가 완료된 두 개의 바이트가있는 또 다른 문제점이 있는데 원래 게시물의 주석에 언급 된대로 수정되었습니다. 고맙습니다! – MathanMV

0

fromStringData.ByteString.Lazy.UTF8utf8-string에서 사용할 수도 있습니다.

aeson과 동일한 ByteString 형식의 함수 모듈입니다. 버퍼에서 사용되는 인코딩으로 UTF8을 사용합니다.