2013-04-04 4 views
1

J'ai 2 lectures. L'un est l'utilisateur. L'utilisateur est un sous-ensemble de la lecture principale appelée Enregistrement.Combiner les lectures JSON en lecture 2.1

{ 
user: { 
    id: "35fc8ba5-56c3-4ebe-9a21-489a1a207d2e", 
    username: "flastname", 
    first_name: "FirstName", 
    last_name: "LastName", 
    email_address: "[email protected]", 
    user_avatar: "http://blog.ideeinc.com/wp-content/uploads/2010/04/tineye-robot.jpg" 
}, 
activity_type: 8 
} 

Inscription: modèles de colis

importation play.api.libs.json._ importation play.api.libs.functional.syntax._

classe cas Inscription ( utilisateur: (String, String, String, String, String, String), ActivityType: Int )

object Registration { 
    implicit val regReads: Reads[Registration] = (
     (__ \ "user").read(
     (__ \ "id").read[String] ~ 
     (__ \ "username").read[String] ~ 
     (__ \ "first_name").read[String] ~ 
     (__ \ "last_name").read[String] ~ 
     (__ \ "email_address").read[String] ~ 
     (__ \ "user_avatar").read[String] 
     tupled 
    ) ~ 
     (__ \ "activity_type").read[Int] 
    )(Registration.apply _) 
} 

En fin de compte, je veux que l'utilisateur soit son propre objet séparé. Je veux être en mesure d'utiliser l'utilisateur dans plusieurs autres lectures, il doit donc être plus modulaire. Est-ce possible?

Bonus: L'utilisateur peut-il sérialiser chaque champ dans des variables séparées ou un hashmap au lieu d'un tuple?

Répondre

3

Vous pouvez extraire User et de l'utiliser à nouveau partout où vous voulez:

case class User(id: String, username: String, firstName: String, lastName: String, email: String, avatar: String) 
case class Registration(user: User, activityType: Int) 

object Implicits{ 
    implicit val userReads = (
    (__ \ "id").read[String] ~ 
    (__ \ "username").read[String] ~ 
    (__ \ "first_name").read[String] ~ 
    (__ \ "last_name").read[String] ~ 
    (__ \ "email_address").read[String] ~ 
    (__ \ "user_avatar").read[String] 
)(User) 

    implicit val regReads = (
    (__ \ "user").read[User] ~ 
    (__ \ "activity_type").read[Int] 
)(Registration)  
} 

import Implicits._ 
Json.fromJson[Registration](json).asOpt.toString 
//Some(Registration(User(35fc8ba5-56c3-4ebe-9a21-489a1a207d2e,flastname,FirstName,LastName,[email protected],http://blog.ideeinc.com/wp-content/uploads/2010/04/tineye-robot.jpg),8)) 
+0

fonctionne parfaitement. Merci beaucoup! – Commander