2015-01-21 6 views
2

Spray-json 1.3.1을 사용하고 있습니다.(de) 직렬화를 위해 enum-like 유형의 값의 유한 집합을 모델화하는 방법은 무엇입니까?

{ 
    "results": [{ 
    ... NOT IMPORTANT PART HERE ... 
    }], 
    "status": "OK" 
} 

이 사용자 정의 프로토콜과

case class Message[T](results: List[T], status: String) 

를 통해 status 문자열 필드에 직렬화 할 수 사소,

object MessageProtocol extends DefaultJsonProtocol { 
    implicit def messageFormat[T: JsonFormat] = jsonFormat2(Message.apply[T]) 
} 

이후 status 필드가 OK 중 하나가 될 수 있습니다 나는 다음과 같은 JSON 메시지가 , ZERO_RESULTS, OVER_QUERY_LIMIT이 필드를 문자열로 갖는 것은 의미가 없습니다.

case class Message[T](results: List[T], status: Status) 
object Status extends Enumeration{ 
    type Status = Value 
    val OK,ZERO_RESULTS,OVER_QUERY_LIMIT, REQUEST_DENIED, INVALID_REQUEST,UNKNOWN_ERROR = Value 
} 

object MessageProtocol extends DefaultJsonProtocol { 
    implicit val statusFormat = jsonFormat(Status) 
    implicit def messageFormat[T: JsonFormat] = jsonFormat2(Message.apply[T]) 
} 

는이 문제를 해결하는 가장 좋은 방법/방법은 무엇입니까 : 나는 자바 배경에서 오는 이대로 다음과 같이 스칼라에서 열거 구현하려고?

+2

Akka-Http를 살펴 보겠습니다. 되었다. 그들은 싱글 톤 객체와 상속을 사용하여 이것을 해결했습니다. -> http://doc.akka.io/api/akka-stream-and-http-experimental/1.0-M2/#akka.http.model.StatusCodes$ –

+1

또한 고려하십시오. 대/소문자 개체 (Daniel Sobral의 스레드 http://stackoverflow.com/questions/1321745/scala-doesnt-have-enums-what-to-use-instead-of-an-enum, 응답 방식) parser/serializer 라이브러리에 따라 모든 것을 파괴하는 dodgy serialization/deserialization 문제 ("status": : "name": "OK"} " –

답변

1

독자적인 RootJsonFormat (Message companion 객체에 암시 적으로)을 구현하고 읽기 및 쓰기 함수를 재정의 할 수 있습니다. 거기에 JsObject가있을 것이고 문자열을 원하는 열거 형으로 변환하는 등 원하는대로 클래스로 변환 할 수 있습니다. 샘플을 볼 수 있습니다. here