0

在 Yesod REST 服务的集成测试中,调用的 API 返回

{
  "userId": "xxx"
}

其中xxx是 MongoDB ObjectID(12 字节十六进制编码字符串)。

我想验证返回的 JSON 实际上是以这种形式使用aeson的。

有没有办法将 JSON 转换为规范形式,比如说

{
   "userId": "-1"
}

如果userId字段的值与给定的正则表达式匹配?

然后我可以使用assertEquals将响应 JSON(实际)与预期值相匹配。

Scala Lift JSON 库中,我可以执行以下操作:

val actual = json.transform {
case JField("userId", value)
  if """[0-9a-f]{24}""".r.findFirstIn(value).isDefined =>
  JField("userId", "-1")
}

埃森有类似的东西吗?

4

1 回答 1

2

对于代数数据类型的通用转换,请查看uniplate包。

例如,给定这个表达式类型:

data Expr = Val Int
          | Add Expr Expr
          | Sub Expr Expr
          | Div Expr Expr
          | Mul Expr Expr
          | Neg Expr
          deriving (Show, Eq)

可以使用此功能将子树转换Neg (Val x)为任何地方:Val (negate x)

import Data.Generics.Uniplate

optimise :: Expr -> Expr
optimise = transform $ \x -> case x of
    Neg (Val i) -> Val (negate i)
    x -> x
于 2014-08-10T15:53:44.000 回答