playframework如何将表单映射到映射[字符串,字符串]

playframework如何将表单映射到映射[字符串,字符串],playframework,playframework-2.0,Playframework,Playframework 2.0,我有一门课 case class EventForm(name: String, attrs: Map[String, String]) 我使用play表单映射将json值转换为EventForm implicit val form = Form( mapping( "name" -> nonEmptyText, "attrs" -> of(mapFormatter) )(EventForm.apply)(EventForm.unap

我有一门课

case class EventForm(name: String, attrs: Map[String, String])
我使用play表单映射将json值转换为
EventForm

 implicit val form = Form(
    mapping(
      "name" -> nonEmptyText,
      "attrs" -> of(mapFormatter)
       )(EventForm.apply)(EventForm.unapply) verifying logicConstraint
  )
映射格式化程序如下所示:

implicit val mapFormatter = new Formatter[Map[String, String]] {
    override def bind(key: String, data: Map[String, String]): Either[Seq[FormError], Map[String, String]] = {
      stringFormat.bind(key, data).right.flatMap { value: String =>
//                  .either(Json.parse(value).as[Map[String, String]]))
//                  .left.map(e => Seq(FormError(key, "error.signedNumber", Nil)))
                Right(Json.parse(value).as[Map[String, String]])
      }
    }

    override def unbind(key: String, value: Map[String, String]): Map[String, String] = {
      Map(key -> Json.toJson(value).toString())
    }
  }
它可以编译,但我会得到一个验证错误,如“attrs required”

}

这里有点棘手,你可以试着打印LN(数据),然后你就会明白为什么了

def mapFormat(errorMessage: String): Formatter[Map[String, String]] = new Formatter[Map[String, String]] {
def bind(key: String, data: Map[String, String]) = {
  val map = data
    .filterKeys(_.startsWith(s"$key."))
    .map(tuple => (tuple._1.substring(key.length + 1), tuple._2))

  val mapOpt = if (map.isEmpty) None else Some(map)
  mapOpt.toRight(Seq(FormError(key, errorMessage, Nil)))
}

def unbind(key: String, value: Map[String, String]) = Map(key -> Json.toJson(value).toString())