2014-01-24 3 views
0

Я после эсон library documentation, но их пример, кажется, не работает для меня:эсон Пример не работает

Код:

{-# LANGUAGE OverloadedStrings #-} 

import Data.Text 
import Data.Aeson 
import Control.Applicative ((<$>),(<*>)) 
import Control.Monad 

instance FromJSON Person where 
    parseJSON (Object v) = Person <$> 
         v .: "name" <*> 
         v .: "age" 
    -- A non-Object value is of the wrong type, so fail. 
    parseJSON _   = mzero 

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

Сообщить об ошибке:

ghci> decode "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person 

Couldn't match expected type `Data.ByteString.Lazy.Internal.ByteString' 
      with actual type `[Char]' 
In the first argument of `decode', namely 
    `"{\"name\":\"Joe\",\"age\":12}"' 
In the expression: 
    decode "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person 
In an equation for `a': 
    a = decode "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person 

Am я здесь что-то не так?

ответ

1

Проблема в том, что decode ожидает ByteString, и вы проходите мимо String.

Попробуйте это в ghci:

:m +Data.ByteString.Lazy.Char8 
decode $ pack "{\"name\":\"Joe\",\"age\":12}" :: Maybe Person 

В реальном коде вы не должны использовать Char8 модуль, как это просто обрезает Char с до 8 бит, не принимая во внимание любой кодировке. Обычно вам следует начать с ByteString, например. прочитав его с диска, используя функции в Data.ByteString.Lazy.

Смежные вопросы