scc
scc

Reputation: 10716

Specify a nested object in scala's play json

Given this code:

    case class SocialUser(firstName: String, lastName: String)
    case class UserDetails(avatarUrl: String, phone: String)

    // I want to avoid having to specify each SocialUser field one by one but just use the implicit write as stated below
    implicit val socialUserWrites = Json.writes[SocialUser] 
    implicit val userDetailsWrites = Json.writes[UserDetails]

Now, how could I output the json in this format?

{"user": {
      "firstName: "",
      "lastName": "",
      "details": {
        "avatarUrl": "",
        "phone": "",
      }
    }}

Upvotes: 0

Views: 557

Answers (1)

andrey.ladniy
andrey.ladniy

Reputation: 1674

You miss "user" in "UserDetail" writes:

implicit val combinedUserWrites: Writes[CombinedUser] = (
  (__ \ "user").write[SocialUser] and
    (__ \ "user" \ "userDetails").write[UserDetails]
  )(unlift(CombinedUser.unapply))

x: CombinedUser = CombinedUser(SocialUser(f,l),UserDetails(a,p))

scala> res4: play.api.libs.json.JsValue = {"user":{"firstName":"f","lastName":"l","userDetails":{"avatarUrl":"a","phone":"p"}}}

Upvotes: 2

Related Questions