[英]Json parsing with scala/play: how to get a trait?
嘗試使用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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.