15

json으로 비교적 간단한 모델을 직렬화하려고합니다. 예를 들어, 나는의 JSON 표현을 좀하고 싶습니다 :play.api.libs.json으로 json에 객체 직렬화하기

case class User(val id: Long, val firstName: String, val lastName: String, val email: Option[String]) { 
    def this() = this(0, "","", Some("")) 
} 

내가 적절한 읽기 및 방법을 쓰거나 다른 방법이 내 자신의 형식 [사용자]를 작성해야합니까? 나는 https://github.com/playframework/Play20/wiki/Scalajson을 보았다. 그러나 나는 아직도 약간 길이다.

답변

22

예, 고객님의 Format 인스턴스를 작성하는 것은 the recommended approach입니다. 예를 들어, 다음 클래스 감안할 때 :

case class User(
    id: Long, 
    firstName: String, 
    lastName: String, 
    email: Option[String] 
) { 
    def this() = this(0, "","", Some("")) 
} 

인스턴스는 다음과 같습니다

import play.api.libs.json._ 

implicit object UserFormat extends Format[User] { 
    def reads(json: JsValue) = User(
    (json \ "id").as[Long], 
    (json \ "firstName").as[String], 
    (json \ "lastName").as[String], 
    (json \ "email").as[Option[String]] 
) 

    def writes(user: User) = JsObject(Seq(
    "id" -> JsNumber(user.id), 
    "firstName" -> JsString(user.firstName), 
    "lastName" -> JsString(user.lastName), 
    "email" -> Json.toJson(user.email) 
)) 
} 

그리고이처럼 사용하십시오 : 자세한 내용은 the documentation를 참조

scala> User(1L, "Some", "Person", Some("[email protected]")) 
res0: User = User(1,Some,Person,Some([email protected])) 

scala> Json.toJson(res0) 
res1: play.api.libs.json.JsValue = {"id":1,"firstName":"Some","lastName":"Person","email":"[email protected]"} 

scala> res1.as[User] 
res2: User = User(1,Some,Person,Some([email protected])) 

을 . 자신의 형식 [사용자]를 작성하지 않고

implicit val userImplicitWrites = Json.writes[User] 
val jsUserValue = Json.toJson(userObject) 

: 사실 사용자에

+0

환상적인 감사 : 나는이 문서에서 그것을 발견하지 않았습니다

implicit val userImplicitReads = Json.reads[User] 

, 여기에 API에 대한 링크입니다! Seq [사용자]를 Json으로 원한다면 어떻게 될까요? :) – LuxuryMode

+0

Play는'Seq'에 대한 인스턴스와 함께 제공되므로'Json.toJson (users) .as [Seq [User]]'를 사용할 수 있습니다. –

+0

Mongo에서 Play의'JsNumber'를 사용하면 직렬화 오류가 발생합니다 :'[error] play - 동작을 호출 할 수 없으므로 결국 오류가 발생합니다 : java.lang.IllegalArgumentException : class scala.math.BigDecimal 클래스를 직렬화 할 수 없습니다. –

6

덕분에 당신은 또한 같은 것을 할 수있는 경우 클래스입니다. 당신은 읽기와 동일한 기능을 수행 할 수 있습니다 : http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.Json $

+0

완벽을 위해서 - implicits을 사용하지 않고 :'Json.reads [User] .reads (myJson) .get' – Ixx

+0

이 것은 이제 대답으로 표시되어야합니다. 업데이트 된 문서 링크 : https://www.playframework.com/documentation/2.5.x/ScalaJsonAutomated –

관련 문제