簡體   English   中英

Json使用scala / play進行解析:如何獲得特質?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM