쓰 임의의 값에서 발견되지 않는 경우스 클래스를 사용하여 플레이(2.2)Scala JSON 콤비네이터

StackOverflow https://stackoverflow.com//questions/23019485

문제

고 싶을 구현하는 Writes 을 방출하는 JSON 목적지에서 발견되는 클래스는 직렬화됩니다.

한 경우 클래스:

case class Foo(i:Int, s:String)

내가 찾는 생산:

{
  "i": <int>,
  "s": "<string>",
  "other": "Some value."
}

의 첫 순진한 시도였:

val writes: Writes[Foo] = ((
  (__ \ "i").write[Int] and
    (__ \ "s").write[String] and
    (__ \ "other").write("Some value.")
  )(unlift(Foo.unapply))

자연적으로는 없을 것으로 컴파일한 후속 and 전화 생산 CanBuild3Fooko unapply 생산 Tuple2.로를 추가하면 값의 결과,생산 Tuple3, 지만,무엇을 찾았 꽤 나쁘언어 관리자들지 않을 것이다 그것을 구현하는.

는 방법이 있을 일-이지만,오히려 오염시키지 않는 내 모델 클래스로 이러한 장식 값을 나는 다음과 같이 추가하는 결과 JSON.

어떤 방법이 있나요?

그것은 당신 이동이 다른 방향으로 제공하는 값과 Reads.pure 한 경우에는 값에 존재하지 않 JSON 지만 지정하여 그 결과 개체입니다.

도움이 되었습니까?

해결책

할 수 있는 이렇게 예쁜 노골적으로 desugaring 트:

val writes: Writes[Foo] = (
  (__ \ "i").write[Int] and
  (__ \ "s").write[String] and
  (__ \ "other").write[String]
)(foo => (foo.i, foo.s, "Some value."))

unlift(Foo.unapply) 은 멋진 방에서 함수 Foo 하의 튜플 종류에 의해 필요에 앞선 실용적 작성기 표현,그리고 그것을 대체할 수 있으로 자신의 기능을 추가 할 수 있습니다 당신이 무엇을 원합니다.

는 경우 고 싶어도 청소기 구문을 사용할 수 있습니다 무형:

import shapeless.syntax.std.tuple._

val writes: Writes[Foo] = (
  (__ \ "i").write[Int] and
  (__ \ "s").write[String] and
  (__ \ "other").write[String]
)(_ :+ "Some value.")

그것은 아름다운이지만,될 것입니다.

다른 팁

또 다른 옵션은 사용하는 개체는 작성기를 구현하는 unapply 는 반환합니다 추가 값입니다.이 기록 청소기이지만,추가로 새로운 개체입니다.내가 찾는 이 유만으로 모두 적용되며 unapply 방법을 사용할 수 있습니다 추가 마사지 데이터의 최종 개체(예를 들어: https://stackoverflow.com/a/22504468/1085606)

예제:

case class Foo(i: Int, s: String)

object FooBuilder {
  def unapply(foo: Foo): Option[(Int, String, String)] = {
    Some((foo.i, foo.s, "Some extra value"))
  }
}

val writes: Writes[Foo] = ((
  (__ \ "i").write[Int] and
    (__ \ "s").write[String] and
    (__ \ "other").write[String]
  )(unlift(FooBuilder.unapply))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top