2012-12-25 2 views
3

Play 2.0 애플리케이션에서 내 모델을 Scala에서 Json으로 직렬화하려고합니다. 응용 프로그램을 실행할 때Play 스칼라로 객체 직렬화하기 api와 Json

package models 

import play.api.libs.json._ 

case class Task(id: Long, label: String, date: String) 

object Task { 

    ... 

    implicit object TaskFormat extends Format[Task] { 
    def reads(json: JsValue): Task = Task(
     (json \ "id").as[Long], 
     (json \ "label").as[String], 
     (json \ "date").as[String]) 

    def writes(t: Task): JsValue = JsObject(Seq(
     "id" -> JsNumber(t.id), 
     "label" -> JsString(t.label), 
     "date" -> JsString(t.date))) 
    } 
} 

가 Unfortunartly 나는 다음과 같은 오류가 발생합니다 : :

verriding method reads in trait Reads of type (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[models.Task]; method reads has incompatible type 

나는 아직 해결책을 찾지 못한이 내 코드처럼 보이는 방법이다. api 문서 (http://www.playframework.org/documentation/api/2.0/scala/play/api/libs/json/package.html)는 내가 취한 접근법을 제안하는 것으로 보입니다.

누구든지 내 실수를 감지합니까?

많은 감사,
조엘

답변

6

오류 메시지가 문제가 무엇인지를 알려줍니다 : 반환 형식은, 직접 Task을하지 반환하는 것처럼 그래서 나에게 보이는

play.api.libs.json.JsResult[models.Task] 

을해야합니다 포장은 JsResult입니다.

저는 Play를 사용하지 않지만 이것은 컴파일러가 알려주려는 것입니다.

그렇다면 문제는 무엇입니까? Play 2.0 설명서를 보면 readsT을 반환합니다. 그러나 the GitHub source을 보면 2012 년 8 월 21 일에 JsResult[T]으로 변경되었습니다.

그래서 한 사람이 작성한 조언보다 최신 버전을 사용하고 있습니다.

최신 API가 온라인 상태인지 여부는 확실하지 않지만 JSON 소스 here을 탐색 할 수 있습니다.

implicit val productReads: Reads[Product] = (
    (__ \ "ean").read[Long] and 
    (__ \ "name").read[String] and 
    (__ \ "description").read[String] 
)(Product.apply _) 

그리고 추가 수입을 잊지 마세요 :

+0

가 좋아 정말로 그것을 지금 보지 못한다. 그러나 그것은 나를 많이 도와주지 않는다. 나는 컴파일러가 알려주는 것을 얻지 만'JsResult [Task] '를 반환하는 방법을 모른다. 웹의 모든 문서에는 내가하는 코드와 동일한 코드가있는 것 같습니다 (예 : http://www.playframework.org/documentation/2.0.1/ScalaJsonGenerics, http://stackoverflow.com/questions/11979638/serializing- 객체 - 투 - json-with-play-api-libs-json). – jokr

+0

@jomikr - 무슨 일이 일어나고 있는지 알기 때문에 내 대답을 편집했습니다. –

+1

그 점을 지적 해 주셔서 감사합니다. 나는 그런 식으로 API를 변경했다고 상상하지 못했습니다. 출처를 보니 마침내 해결책을 찾았습니다 : def read (json : JsValue) = JsSuccess ( (json \ "id"). [Long], (json \ "label"). , (json \ "date"). [String]))'' – jokr

1

this 포스트에 따르면, 구현하는 더 정확한 방법은 재생 2.1 [T]를 읽는 것 어쩌면,

import play.api.libs.functional.syntax._ 
import play.api.libs.json._ 
관련 문제