쓰 임의의 값에서 발견되지 않는 경우스 클래스를 사용하여 플레이(2.2)Scala JSON 콤비네이터
-
21-12-2019 - |
문제
고 싶을 구현하는 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
전화 생산 CanBuild3
고 Foo
ko 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))