Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can do it this way:</p> <pre><code>case class SocialUser(firstName: String, lastName: String) case class UserDetails(avatarUrl: String, phone: String) case class CombinedUser(user: SocialUser, userDetails: UserDetails) implicit val combinedUserReads: Reads[CombinedUser] = ( (__ \ "user").read(( (__ \ "firstName").read[String] and (__ \ "lastName").read[String] )(SocialUser)) and (__ \ "userDetails").read(( (__ \ "avatarUrl").read[String] and (__ \ "phone").read[String] )(UserDetails)) )(CombinedUser) </code></pre> <p>However its better to create separated <code>Reads</code>:</p> <pre><code>implicit val socialUserReads = ( (__ \ "firstName").read[String] and (__ \ "lastName").read[String] )(SocialUser) implicit val userDetailsReads = ( (__ \ "avatarUrl").read[String] and (__ \ "phone").read[String] )(UserDetails) implicit val combinedUserReads: Reads[CombinedUser] = ( (__ \ "user").read[SocialUser] and (__ \ "userDetails").read[UserDetails] )(CombinedUser) </code></pre> <p>Edit: for simple case classes, <a href="http://www.playframework.com/documentation/2.1.1/ScalaJsonInception">its possible to do</a>:</p> <pre><code>implicit val socialUserReads = Json.format[SocialUser] implicit val userDetailsReads = Json.format[UserDetails] implicit val combinedUserReads = Json.format[CombinedUser] </code></pre> <p><a href="http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators">Here</a> is quite comprehensive introduction to JSON Reads and more.</p> <blockquote> <p>How about partial objects? If I don't want to fill in every field in the constructor, can I pass empties or do I overload the constructor or similar?</p> </blockquote> <p>Use <code>Option</code>:</p> <pre><code>case class CombinedUser(user: SocialUser, userDetails: Option[UserDetails]) //reads implicit val combinedUserReads: Reads[CombinedUser] = ( (__ \ "user").read[SocialUser] and (__ \ "userDetails").readOpt[UserDetails] )(CombinedUser) //writes implicit val combinedUserWrites: Writes[CombinedUser] = ( //socialUserWrites and userDetailsWrites must be in scope (__ \ "user").write[SocialUser] and (__ \ "userDetails").write[Option[UserDetails]] )(unlift(CombinedUser.unapply)) val json = Json.obj( "user" -&gt; Json.obj( "firstName" -&gt; "Homer", "lastName" -&gt; "Simpson" ) ) Json.fromJson[CombinedUser](json) //JsSuccess(CombinedUser(SocialUser(Homer,Simpson),None),) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload