如何使用参数转换json并添加验证

如何使用参数转换json并添加验证,json,playframework-2.3,play-reactivemongo,Json,Playframework 2.3,Play Reactivemongo,环境:使用reactivemongo播放2.3 我读了《海岸到海岸》的文章,喜欢文章的基础。目前,许多例子仍超出我的理解范围,但我正在努力做到这一点 作为探索这种方法的一部分,我正在构建一个简单的contacts REST api。该方法通过URL传递父id,而主体包含其余的id。有三件事我一直坚持着 如何向字符串添加验证规则(如最小/最大长度) 如何使字符串值成为可选值 如何将参数注入Json值 如何在Json结构中为address添加一个子节 有没有更好的方法来实现这一点 第一部分是转换详细

环境:使用reactivemongo播放2.3

我读了《海岸到海岸》的文章,喜欢文章的基础。目前,许多例子仍超出我的理解范围,但我正在努力做到这一点

作为探索这种方法的一部分,我正在构建一个简单的contacts REST api。该方法通过URL传递父id,而主体包含其余的id。有三件事我一直坚持着

  • 如何向字符串添加验证规则(如最小/最大长度)
  • 如何使字符串值成为可选值
  • 如何将参数注入Json值
  • 如何在Json结构中为address添加一个子节
  • 有没有更好的方法来实现这一点

    第一部分是转换详细信息,但我想添加最大长度验证,并将一些字段更改为可选字段

    val validateContact: Reads[JsObject] = (
      (__ \ 'fullname).json.pickBranch and
      (__ \ 'email).json.pickBranch( Reads.of[JsString] keepAnd Reads.email ) and
      (__ \ 'phone).json.pickBranch and
      (__ \ 'mobile).json.pickBranch( Reads.of[JsString] )  and
      (__ \ 'labels).json.copyFrom(labelsOrEmptyArray)
      //TODO: include address { street1, city, state, zip }
    ).reduce
    
    val validateLabels = Reads.verifyingIf( (arr: JsArray) => !arr.value.isEmpty)(Reads.list[String])
    val labelsOrEmptyArray = ((__ \ 'labels).json.pick[JsArray] orElse Reads.pure(Json.arr())) andThen validateLabels
    val generateId = (__ \ '_id \ '$oid).json.put( JsString(BSONObjectID.generate.stringify) )
    val generateCreated = (__ \ 'created \ '$date).json.put( JsNumber((new java.util.Date).getTime) )
    val addMongoIdAndDate: Reads[JsObject] = __.json.update( (generateId and generateCreated).reduce )
    
    这是控制器上的REST调用。请注意需要添加到Json中的parentid参数,以便在Mongo中存储

    def create(parentid:BSONObjectID) = Action.async(parse.json) { implicit request =>
      request.body.transform(validateContact andThen addMongoIdAndDate).map { result =>
        collection.insert(result).map { LastError =>
          Logger.debug(s"Successfully inserted with LastError: $LastError")
          Created
        }
      }.getOrElse(Future.successful(BadRequest("Invalid json")))
    }
    
    添加“keepAnd-Reads.maxLength(20)”不会编译,但许多示例显示它正在使用?是否有办法扩展验证功能集并添加我自己的功能集

    更新1:我正在学习Scala,因此在这一点上,我可能忽略了或误解了Scala语言的一些简单内容。不久前,我对Play1/Java更为熟悉

    Update2:我还注意到“PickBranch”调用没有区分字符串值和对象。其他人是如何处理的