当尝试使用play2在Scala中读取Json时,我陷入困境,并利用该信息创建了一个对象。
这是我现在的代码:
trait MyTrait {
}
object object1 extends MyTrait {
override def toString: String = "object1"
}
object object2 extends MyTrait{
override def toString: String = "object2"
}
def strToObject(str: String): MyTrait = str match {
case "object1" => object1
case "object2" => object2
}
这就是我写Json的方式:
implicit val traitWrites = new Writes[MyTrait] {
def writes(t: MyTrait) = Json.obj(
"t" -> t.toString)
}
输出量
println("object1: " + Json.toJson(object1).toString)
println("object2: " + Json.toJson(object1).toString)
object1: {"t":"object1"}
object2: {"t":"object1"}
这就是我试图读取的方式,但是它不起作用。
implicit val traitReads: Reads[MyTrait] = (
(JsPath \ " t" ).read[String])map(str => strToObject(str)) (MyTrait.apply _)
val jsonObject = Json.parse(Json.toJson(object1).toString)
val aux = jsonObject \ "t"
val myobject = aux.as[MyTrait]
它抱怨(MyTrait.apply _)和[MyTrait]带有“未找到:值MyTrait”。但是,对于标准类,这是完全相同的事情,因此我真的不知道如何进行。
任何想法?我是Play的新手(确实也是Scala),所以我可能在做一些非常基本的错误。特别是,我高度怀疑“地图”调用。
干杯,
最佳答案
特性没有apply方法,这些通常与case类一起使用。
您可以扩展Reads特质并实现reads方法,如下所示:
implicit val creatureReads = new Reads[MyTrait] {
override def reads(js: JsValue): JsResult[MyTrait] = {
JsSuccess(strToObject((js \ "t" ).as[String]))
}
}
我编辑了答案以返回JsSuccess,可以添加更好的验证来检查是否存在“ t”。
您的代码也应该调用:
val myobject = jsonObject.as[MyTrait]