使用play 2进行Json转换和验证

时间:2013-09-01 02:57:00

标签: json validation scala playframework

我是Play2的新手。我想用它来验证和转换传入的json对象。这是我到目前为止的代码。我想知道使用变换器验证和转换用户输入的推荐方法是什么。我也不确定我定义的email2函数(处理JsString)实际上是必要的,或者是否有办法避免定义它。

def email2(implicit reads:Reads[JsString]) : Reads[JsString] = 
pattern( """\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b""".r, "validate.error.email" )

def pattern(regex: => scala.util.matching.Regex, error: String = "error.pattern")(implicit reads:Reads[JsString]) =
Reads[JsString]( js => reads.reads(js).flatMap { o =>
  regex.unapplySeq(o.value).map( _ => JsSuccess(o) ).getOrElse(JsError(error))
})

val transformer = (
  (__ \ '_id).json.put(JsString(new ObjectId().toString)) and
  (__ \ 'email).json.update(__.readNullable[JsString](email2)).orElse(JsNull))
  ) reduce

request.body.transform(transformer) match {
  case JsSuccess(value:JsValue,_)=>  Async {
        collection.insert(value).map{
          case someError:LastError if someError.err.isDefined =>  Ok(Json.obj("errors"->List("Insertion failed:"+Json.prettyPrint(value))))
          case others => Ok(value)
        }
      }
  case errors:JsError => Ok(Json.obj("errors"->JsError.toFlatJson(errors)))

在这里我希望将电子邮件作为可选字段,如果该字段存在,则它应该是有效的电子邮件地址,如果该字段不存在我想要使用null。如果电子邮件无效,我希望向用户发送错误消息。

此代码尚未编译,我不确定他们是否使用变换器,验证用户输入是否正确。

0 个答案:

没有答案