2017-12-15 17 views
1

play2を使ってScalaのJsonを読み込み、その情報を使ってオブジェクトを作成しようとすると、私は立ち往生します。 これは私のコードは今ある:Jsonはscala/playを使って解析します:どのように特性を得るか?

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でもあまりにも真実である)とかなりの初心者ですので、おそらく私は何か非常に基本的な間違ったことをやっています。特に、私は "地図"呼び出しの疑いが強い。

乾杯、

+0

封印された形質自動的おかげで非常に多く、魅力として働く – cchantep

答えて

4

形質が適用方法を持っていない、これらは通常、ケースクラスで使用されています。 あなたは形質を読み込み、メソッドを読み込み、実装を拡張することができ、このように:

implicit val creatureReads = new Reads[MyTrait] { 
    override def reads(js: JsValue): JsResult[MyTrait] = { 
    JsSuccess(strToObject((js \ "t").as[String])) 
    } 
} 

私はあなたが「T」の存在を確認することをお勧め検証を追加することができ、JsSuccessを返すように私の答えを編集しました。

また、あなたのコードを呼び出すする必要があります。

val myobject = jsonObject.as[MyTrait] 
+0

最新のリリースでサポートされています –

関連する問題