play-json의 Json.format[]
매크로로 다음 사례 클래스 구문을 처리 할 수없는 이유를 알 수 없습니다. 더 구체적으로, 컴파일러에 의해 제기 된 오류는 내게 문제가 무엇인지 그리고 어떻게 해결할 수 있는지에 대한 단서를주지 않습니다.일반 형식의 속성이있는 사례 클래스에 대해 play-json 형식 매크로가 실패합니다.
주어진 다음의 정의 :
trait Evt[T <: Evt[T]] {
def meta: Meta[T]
}
case class Meta[T <: Evt[T]](value: String)
case class X(meta: Meta[X], data: String) extends Evt[X]
내가 JSON 형식은 다음과 같이 구현하기 위해 노력했다. Meta[X]
의 형식은 단지 사전 시도입니다. 나는 여기에 Json.format[X]
을 사용하는 표준 방법과 아래에 설명 된 컴파일 오류에 더 관심이있다. 이것은 다음과 같은 오류를 얻을 컴파일하려고
import play.api.libs.json._
object Formats {
implicit val metaFormat = new Format[Meta[X]] {
override def writes(o: Meta[X]): JsValue = JsString(o.value)
override def reads(json: JsValue): JsResult[Meta[X]] = json.validate[String] match {
case JsSuccess(value, path) => JsSuccess(Meta[X](value), path)
case error: JsError => error
}
}
implicit val xFormat: Format[X] = Json.format[X]
}
:
[error] ...: type mismatch;
[error] found : X
[error] required: Meta[X]
[error] implicit val xFormat: Format[X] = Json.format[X]
[error] ^
나는 이런 일이 발생하고 그래서 위의 같은 구조를 포맷 할 수 있습니다이 문제를 해결하는 방법에 대한 가능성이 몇 가지 단서 이유를 이해하고 싶습니다 . 좀 더 생각 후
- 스칼라 2.11.4
- 플레이 json_2.11-2.3.6
업데이트
를 사용하고 내가 의심 것 파고
이 컴파일 오류를 일으키는 컴파일러 매크로에 의해 생성되는 코드. 적어도 나를위한 오류 메시지는 관계에 의미가 없으므로 코드 줄이 인쇄되었습니다. 나는 scalac 옵션 -Ymacro-debug-lite
와 코드를 검사하기 위해 노력하고 이것이 내가 가진 무엇 :
{
import play.api.libs.functional.syntax._;
final class $anon extends play.api.libs.json.util.LazyHelper[Format, X] {
def <init>() = {
super.<init>();
()
};
override lazy val lazyStuff: Format[X] = play.api.libs.json.JsPath.$bslash("meta").lazyFormat(this.lazyStuff).and(play.api.libs.json.JsPath.$bslash("data").format(json.this.Format.GenericFormat[String](json.this.Reads.StringReads, json.this.Writes.StringWrites))).apply(((meta, data) => X.apply(meta, data)), play.api.libs.functional.syntax.unlift(X.unapply))
};
new $anon()
}.lazyStuff
가 나는 부분 $bslash("meta").lazyFormat(this.lazyStuff)
컴파일 오류가 발생할 것 같아, this.lazyStuff
이 장소에서 Format[X]
반면를 반환으로 (경로 meta
에 대한) Format[Meta[X]]
이 필요합니다.
이 분석에서는 format
매크로의 단점처럼 보입니다. 그러나이 분석이 정확한지 확신 할 수 없으므로 여전히 명확한 설명이 필요합니다.
업데이트 2
좀 더 실험이 문제가 반복적으로 단지 유형을 정의하는 제한되지 않는다는 것을 밝혔다. 또한이 구조의 format
매크로를 사용하려고하면 같은 오류와 함께 실패합니다
trait Evt[T] {
def meta: Meta[T]
}
case class Meta[T](value: String, anotherValue: String)
case class X(meta: Meta[X], data: String) extends Evt[X]
내가 매크로
here에 대한 몇 가지 가능성이 관련 일을 발견했다. 그러나 2.4.0-M1의 플레이 프레임 워크를 사용해도 같은 문제가 나타났습니다.
: JSON 콤비를 사용하여 작동하는 것 같다 'case class Foo (childFoo : Foo)'와 같은 다른 경우에 관한 것입니다. combinators에 대한 힌트를 주셔서 감사합니다. 그러나 저는'format' 매크로에 의해 제공되는 단순화 이후 정말로 여기에 있습니다. – lost
@lost 여전히 매크로가 질식하고 있습니다. –