如何声明以下数据类型的FromJSON实例:

data Privacy = Everyone |
           AllFriends |
           FriendsOfFriends |
           Self

这样就可以遵循以下字符串来枚举数据类型:
"EVERYONE" -> Everyone
"ALL_FRIENDS" -> AllFriends
"FRIENDS_OF_FRIENDS" -> FriendsOfFriends
"SELF" -> Self
_ -> Parsing error

可能的解决方案是here提示,但我无法编译该代码。

谢谢!

最佳答案

FromJSON定义应为:

instance FromJSON Privacy where
     parseJSON (Object v) = createPrivacy <$> (v .: "value")

完整的工作示例:
{-# LANGUAGE OverloadedStrings #-}

import Data.Text
import Data.Aeson
import Control.Applicative
import Control.Monad

data Privacy = Everyone |
               AllFriends |
               FriendsOfFriends |
               Self
  deriving (Show)

instance FromJSON Privacy where
     parseJSON (Object v) = createPrivacy <$> (v .: "value")
     parseJSON _          = mzero

createPrivacy :: String -> Privacy
createPrivacy "EVERYONE" = Everyone
createPrivacy "ALL_FRIENDS" = AllFriends
createPrivacy "FRIENDS_OF_FRIENDS" = FriendsOfFriends
createPrivacy "SELF" = Self
createPrivacy _ = error "Invalid privacy setting!"

main = do
    let a = decode "{\"value\":\"ALL_FRIENDS\",\"foo\":12}" :: Maybe Privacy
    print a

关于json - Aeson:解析枚举数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27076491/

10-13 01:18