2017-12-15 21 views
1

play2를 사용하여 스칼라에서 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 (와 스칼라도 마찬가지입니다.)와 함께 꽤 초보자입니다. 아마도 아주 기본적인 잘못을 저지르고있을 것입니다. 특히, 나는 "지도"호출을 매우 의심합니다. 특색은이 방법을 적용하지 않아도

+0

밀봉 특성이 자동으로 최신 버전에서 지원하는 매력으로 – cchantep

답변

4

건배, 이들은 일반적으로 케이스 클래스와 함께 사용됩니다. 당신은이 특성을 읽어 확장하고 구현하는이 같은 방법을 읽을 수 있습니다

나는 JsSuccess를 반환하는 내 대답을 편집
implicit val creatureReads = new Reads[MyTrait] { 
    override def reads(js: JsValue): JsResult[MyTrait] = { 
    JsSuccess(strToObject((js \ "t").as[String])) 
    } 
} 

, 당신은 "t"의 존재를 확인하기 위해 더 나은 유효성 검사를 추가 할 수 있습니다.

또한 당신의 코드를 호출해야합니다

val myobject = jsonObject.as[MyTrait] 
+0

작품, 정말 고마워 –