在playframework中解析不带键的Json序列

在playframework中解析不带键的Json序列,json,scala,playframework-2.0,Json,Scala,Playframework 2.0,我试图解析一个Json对象,它只包含一个顶级数组,没有键 import play.api.libs.json._ import play.api.libs.functional.syntax._ case class Name(first: String, last: String) case class Names(names: Seq[Name]) implicit val NameF = Json.format[Name] val s = """[{"first": "A", "la

我试图解析一个Json对象,它只包含一个顶级数组,没有键

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Name(first: String, last: String)
case class Names(names: Seq[Name])

implicit val NameF = Json.format[Name]

val s = """[{"first": "A", "last": "B"},{"first": "C", "last": "D"},{"first": "E", "last": "F"}]"""

implicit val NF: Reads[Names] = (
    JsPath.read[Seq[Name]]
)(Names.apply _)

<console>:34: error: overloaded method value read with alternatives:
  (t: Seq[Name])play.api.libs.json.Reads[Seq[Name]] <and>
  (implicit r: play.api.libs.json.Reads[Seq[Name]])play.api.libs.json.Reads[Seq[Name]]
 cannot be applied to (Seq[Name] => Names)
            JsPath.read[Seq[Name]]
import play.api.libs.json_
导入play.api.libs.functional.syntax_
案例类名称(第一个:字符串,最后一个:字符串)
案例类别名称(名称:Seq[名称])
隐式val NameF=Json.format[Name]
val s=“”[{“first”:“A”,“last”:“B”},{“first”:“C”,“last”:“D”},{“first”:“E”,“last”:“F”}]”
隐式val NF:读取[名称]=(
JsPath.read[Seq[Name]]
)(Names.apply)
:34:错误:使用可选项读取重载方法值:
(t:Seq[Name])play.api.libs.json.Reads[Seq[Name]]
(隐式r:play.api.libs.json.Reads[Seq[Name]])play.api.libs.json.Reads[Seq[Name]]
无法应用于(Seq[Name]=>名称)
JsPath.read[Seq[Name]]

如果已经为
名称定义了
读取项,则无需为
序列[Name]
指定
读取项

case class Name(first: String, last: String)

implicit val NameF = Json.format[Name]

val s = """[{"first": "A", "last": "B"},{"first": "C", "last": "D"},{"first": "E", "last": "F"}]"""

scala> Json.parse(s).validate[Seq[Name]]
res2: play.api.libs.json.JsResult[Seq[Name]] = JsSuccess(List(Name(A,B), Name(C,D), Name(E,F)),)

如果已经为
Name
定义了一个,则无需为
Seq[Name]
指定
Reads

case class Name(first: String, last: String)

implicit val NameF = Json.format[Name]

val s = """[{"first": "A", "last": "B"},{"first": "C", "last": "D"},{"first": "E", "last": "F"}]"""

scala> Json.parse(s).validate[Seq[Name]]
res2: play.api.libs.json.JsResult[Seq[Name]] = JsSuccess(List(Name(A,B), Name(C,D), Name(E,F)),)

一种可能性是通过创建隐式Reads函数:

  def readNames: Reads[Names] = new Reads[Names] {
    def reads(json: JsValue) = {
      json.validate[Seq[Name]].map(succ => Names(succ))
    }
  }

  implicit val NamesFormat = readNames

一种可能性是通过创建隐式Reads函数:

  def readNames: Reads[Names] = new Reads[Names] {
    def reads(json: JsValue) = {
      json.validate[Seq[Name]].map(succ => Names(succ))
    }
  }

  implicit val NamesFormat = readNames

但是我想写Json.parse.validate[Names]。这可能吗?没有钥匙就不行。但是,当上面的方法工作得很好时,为什么还要复制代码呢?这是可能的,我实际上需要它来抽象over Reads[T],但我想编写Json.parse(s).validate[Names]。这可能吗?没有钥匙就不行。但是,当上面的方法工作得很好时,为什么还要复制代码呢?这是可能的,而且我实际上需要它来抽象读取[T],不过,将
Seq
包装到另一个容器中似乎相当笨拙。这是必要的,因为我有一个方法查询[T](qs:String)(隐式r:Read[T]):NonEmptyList[String]\/T。在这个方法中,它调用一个web服务并解析响应:Json.parse(s).validate[T]在另一个容器中包装
Seq
似乎相当笨拙。这是必要的,因为我有一个方法查询[T](qs:String)(隐式r:Read[T]):NonEmptyList[String]\/T。在该方法中,它调用一个web服务并解析响应:Json.parse(s.validate[T]