在playframework中解析不带键的Json序列
我试图解析一个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
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]