我正在使用Scala编写Play 2.3.2应用程序。
在我的控制器中,我定义了一个代表标签的类和一个隐式阅读器,如下所示:
private case class RestTag(tag: String)
private implicit val tagReader = Json.reads[RestTag]//reader of RestTag objects
在我的应用程序中,我使用以下格式获取json请求的REST方法:
{"tags": [{"tag": "cat1:attri1:"},
{"tag": "cat2:attr1"}
]
}
我如何解析request.body.asJson
并从json传递到包含所有List[String]
值的"tag"
?
这可能吗?
或者我需要更改RestTag
类以匹配Rest请求??
我的控制器方法的实现类似于以下内容:
def userMatchingTag = CorsAction.async { request =>
val jsonObject = request.body.asJson
jsonObject match {
case Some(x) => x match {
//here if x is JsArray[RestTag] transform it in a List[String] and do some work
//otherwise returns a Future{BadRequest}
}
case None => Future{BadRequest("Need json")}
}
}
我该怎么做?
答案 0 :(得分:1)
使用您的implicit val tagReader
:
val str =
"""{"tags": [{"tag": "cat1:attri1:"},
{"tag": "cat2:attr1"}]}"""
val tagsReads = (JsPath \ "tags").read[List[RestTag]].map{_.map{_.tag}}
val res = Json.parse(str).validate(tagsReads)
// JsSuccess(List(cat1:attri1:, cat2:attr1),/tags)
res match {
case JsSuccess(list, _) => println(list)
case e: JsError => println(e)
}
//List(cat1:attri1:, cat2:attr1)
没有RestTag
类:
val tagsReads =
(JsPath \ "tags").read(Reads.list(
(JsPath \ "tag").read[String]
))
val res = Json.parse(str).validate(tagsReads)
// JsSuccess(List(cat1:attri1:, cat2:attr1),/tags)