0

이 컴파일되지 않습니다 :Playframeworks json 암시 적 쓰기에는 명시 적 유형이 필요하며 그 이유는 무엇입니까?

package model 

import play.api.libs.json._ 

case class Dog(id: Long, name: String, kind: String) { 

    def asJson() = Json.toJson(this) 
} 

object Dog { 
    implicit val writes = Json.writes[Dog] 
} 

오류 :

53. Waiting for source changes... (press enter to interrupt) 
[info] Compiling 1 Scala source to /Users/pablo/projects/mvp/target/scala-2.10/classes... 
[error] /Users/pablo/projects/mvp/app/models/model2.scala:7: No Json deserializer found for type model.Dog. Try to implement an implicit Writes or Format for this type. 
[error] def asJson() = Json.toJson(this) 
[error]       ^
[error] one error found 
[error] (compile:compile) Compilation failed 

는 동반자 개체 (명시 적 유형에주의를) 변경 :

object Dog { 
    implicit val writes: Writes[Dog] = Json.writes[Dog] 
} 

수정 문제. 왜 그런가요?

+0

'Json.writes' 서명은'def write [A] : [A]'를 써서 타입이 정확히 명시 적이기에주의하십시오. –

+1

필자는 스칼라에 대해서 충분히 알지 못하지만, [Writes [-A]'] (http://www.playframework.com/documentation/2.3.x/api/scala/index. html # play.api.libs.json.Writes)는 반 변형입니다. 이 경우 스칼라가 함축을 처리 할 수 ​​있는지 여부는 알 수 없습니다. – Carsten

답변

1

이 대답은 정말 아니다 (하지만 난 내 코드를 붙여 공간을 많이 필요로한다!) 그러나 이것은 나를 위해 작동 :

package model 

import play.api.libs.json._ 

object Dog { 
    implicit val writes = Json.writes[Dog] 
} 

case class Dog(id: Long, name: String, kind: String) { 

    def asJson() = Json.toJson(this) 
} 

는 기본적으로 난 그냥 수업 전에 객체 선언을 움직였다. 이는 Json.writes 매크로가 매크로를 사용하므로 구성된 Write 인스턴스를 사용하기 전에 발생해야하기 때문일 수 있습니다.

+0

upvoted, 정보 주셔서 감사합니다. 나는 선언문의 순서와는 다른 설명이 있기를 정말로 바란다. –

1

매크로는 실험적인 기능이므로 너무 많이 의존하지 않습니다. 나는이 훨씬 더 자세한 것을 알고,하지만 당신은 연결자를 사용하는 경우 작동합니다 :

implicit val writes: Writes[Dog] = (
    (JsPath \ "id").write[Long] and 
    (JsPath \ "name").write[String] and 
    (JsPath \ "kind").write[String] 
)(unlift(Dog.unapply)) 

http://www.playframework.com/documentation/2.3.x/ScalaJsonCombinators

1

Json.toJson이 컴파일시에 실행되는 매크로입니다. 이 단계에서 유형 분석이 아직 수행되지 않았습니다. 즉, 메소드 매개 변수 유형 (this)을 자동으로 유추 할 수 없습니다. (매크로가 추가 기능을 구현해야한다면 유추 할 수 있습니다. 이것을 매우 어렵다고 가정하십시오). 이것이 Json.toJson [Dog]과 같은 유형 매개 변수를 제공해야하는 이유입니다.

당신은 동반자 오브젝트과 같이 선언 할 때 :
object Dog { 
    implicit val writes: Writes[Dog] = Json.writes[Dog] 
} 

당신이 유형에 대한 암시 작가를 선언합니다. Scala의 암시 적 해석 규칙이 주어지면 케이스 클래스 인스턴스를 JSON으로 변환하려고 할 때 작성자가 범위에서 발견됩니다. 따라서 작동하지만 클래스의 asJson() 메소드가 아니라 암시 적 해결책이 첨부 객체에 정의 된 작성기를 찾았 기 때문에 가능합니다.