2016-06-13 12 views
1
data Message = Message { 
    type :: String 
} deriving (Eq, Show, Data, Typeable) 


-- main funciton 
let m = decodeJSON "{\"type\":\"event\"}" :: Message 
putStrLn (type m) 

ここで、私はwebsocket接続から受け取ったメッセージをデコードしようとしています。しかし、Haskellでは、メッセージタイプの属性として 'type'を使用することはできません。属性に型などの単語が含まれている場合、このJSONメッセージをデコードする方法は何でしょうか。デコード用の属性名

答えて

2

typeをレコードタイプとして使用すると、いくつかの変更を加える必要があります。

あなたの代わりにJSONパッケージのアイソーンを使用して喜んでいる場合は、次のように、手でインスタンスを書き込むことによってこれを行うことができます....

data Message = Message { 
    type' :: String 
    } deriving (Eq, Show) 

instance FromJSON Message where 
    parseJSON (Object v) = Message <$> v .: "type" 

main = do 
    let m = decode "{\"type\":\"event\"}" :: Maybe Message 
    putStrLn (show $ fmap type' m) 

あなたはの流れを変更する必要がありますプログラムをちょっと....

+0

main.hs:40:22: 予想されるタイプ 'Text'と実際のタイプ '[Char]'を一致させることができませんでした '(。:)'、つまり '' type '' '(<$>)'の2番目の引数、つまり 'v。: "と入力します。"' 式:Message <$> v。: "type" –

+0

@OguzBilgic 'OverloadedStrings'または' pack'を自分で起動します。 –

関連する問題