2017-03-29 11 views
1

나는 HTTP GET 요청에 대응하는 빈 경우 클래스가 있습니다play-json으로 빈 케이스 클래스를 읽고 쓰려면 어떻게해야합니까?

case class GetFoo() extends MyQueryRequest { 
    // ... 
} 

을하고 암시 적 JSON 작가와 독자 기술로 각각의 메시지는 동반자 개체가 있습니다 : 그러나

object GetFoo extends MyImplicitJsonProvider[GetFoo] { 
    implicit val write = Json.writes[GetFoo] 
    implicit val read = Json.reads[GetFoo] 
} 

GetFoo이 필요하기 때문에, 매개 변수가 없으면이를 직렬화 할 방법이 없습니다.

개체 적용 취소 GetFoo에는 매개 변수가 없습니다. 빈 케이스 클래스를 사용하고 있습니까?

GetFoo의 생성자에 더미 부울 변수를 삽입하는 것이 좋습니다. 그러나 이것은 엉성한 것입니다. GetFoo (de)을 비어있는 JSON 객체로 serializable로 만들고 싶습니다. 어떻게해야합니까?

GET 요청은 데이터를 보내지 않기 때문에 요청을 쓰거나 읽을 필요가 없으므로 리더/라이터가 사용 중이면 예외를 throw하는 것이 좋습니다. 확장 클래스

내 디자인은 GetX 확장 클래스 MyQueryRequestGetX 확장 개체 (MyImplicitJsonProvider[GetX])를 사용합니다.

답변

4

그냥 비 구현 암시 값을 가지고 싶다면, 당신은 아주 잘

implicit def format: Format[GetFoo] = ??? 

이것은 당신이 그것을 필요로 할 때 언제든지 범위에 암시를 추가합니다 할 수 있으며, 오류

을 던지기 만 호출 될 경우 NotImplementedException을 던집니다.

더미 직렬화는 JsObject 빈으로 (비) 직렬화를 원한다면

, 그냥 같은 그것을 구현 :

implicit val nonStrictReads = Reads.pure(GetFoo()) // does not check anything on the `JsValue`, always give a `JsSuccess(GetFoo())` 
implicit val strictReads = Reads[GetFoo](json => json.validate[JsObject].filter(_.values.isEmpty).map(_ => GetFoo()) 
implicit val writes = OWrites[GetFoo](_ => Json.obj()) 

더 나은 캐치를하는 동안 할 수 있습니다 그러나

, 당신의 요청에 아무런 내용이 없다는 것을 확실하게 (강한 타이핑을 통해)함으로써 컴파일 타임에 오류를 잡는 것이 낫습니다. 이렇게하려면 MyQueryRequestMyImplicitJsonProvider에 대한 추가 정보가 필요하지만 콘텐츠가있는 지 여부에 따라 MyQueryRequest[NoContent] 또는 MyQueryRequest[JsValue]과 같은 작업을한다고 상상할 수 있습니다. 그렇다면 JSON 직렬 변환기가 필요하지만 다른 직렬 변환기는 필요하지 않습니다.

그런데 비어있는 사례 클래스를 사례 개체로 대체하여 불필요한 다중 할당을 피할 수 있습니다 (일부를 제외하고).

+0

'strictReads'는 완벽하게 작동했습니다. 건배! – erip