忽略Haskell Aeson输入中的JSON字段

时间:2014-07-27 17:06:41

标签: haskell aeson

我有一个Haskell记录

data User = User
    { email :: Text
    , token :: Text
    }

我想忽略"令牌"的价值在任何输入JSON中。例如,如果输入JSON是

{
    "email": "foo@bar.com",
    "token": "abc123"
}

我希望生成的User对象包含User { email = "foo@bar.com", token = "" }

我定义了以下内容:

instance FromJSON User where
    parseJSON (Object v) =
        User <$> v .:  "email"
             <*> v .:? "" .!= "" -- token

    parseJSON _ = fail "Invalid User"

是否有更好的方法来设置token字段的值,然后设置v .:? "" .!= "",忽略JSON中的"token": "abc123"

我试过

instance FromJSON User where
    parseJSON (Object v) =
        User <$> v .:  "email"
             <*> "" -- token

    parseJSON _ = fail "Invalid User"

但它不会编译,因为<*> ""必须是Parser Text

1 个答案:

答案 0 :(得分:5)

你试过这个吗?

User <$> v .: "email" <*> pure ""

pure函数来自Control.Applicative模块。在这种情况下,它构造了一个简单的解析器,它将""作为结果。如果您不熟悉applicative functors,可以在typeclassopedia上阅读它们。