3

我有一个 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 .:? "" .!= "",而忽略"token": "abc123"JSON 中的?

我试过了

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

    parseJSON _ = fail "Invalid User"

但它不会编译,因为<*> ""需要是Parser Text.

4

1 回答 1

5

你试过这个吗?

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

pure功能来自Control.Applicative模块。在这种情况下,它构造了一个简单的解析器,并将""其作为结果传递。如果您不熟悉应用函子,您可以在typeclassopedia上阅读它们。

于 2014-07-27T17:14:06.390 回答