将json请求转换为播放应用程序中的JsArray [T]

时间:2014-10-15 07:43:34

标签: json scala rest playframework

我正在使用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")}
    }
  }

我该怎么做?

1 个答案:

答案 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)