忽略Haskell Aeson输入中的JSON字段

Ral*_*lph 3 haskell aeson

我有一个Haskell记录

data User = User
    { email :: Text
    , token :: Text
    }
Run Code Online (Sandbox Code Playgroud)

我想在任何输入JSON中忽略"token"的值.例如,如果输入JSON是

{
    "email": "foo@bar.com",
    "token": "abc123"
}
Run Code Online (Sandbox Code Playgroud)

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

我定义了以下内容:

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

    parseJSON _ = fail "Invalid User"
Run Code Online (Sandbox Code Playgroud)

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

我试过了

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

    parseJSON _ = fail "Invalid User"
Run Code Online (Sandbox Code Playgroud)

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

Pio*_*Miś 5

你试过这个吗?

User <$> v .: "email" <*> pure ""
Run Code Online (Sandbox Code Playgroud)

pure功能来自Control.Applicative模块.在这种情况下,它构造一个简单的解析器,""作为其结果.如果您不熟悉applicative functors,可以在类别数据库中阅读它们.