Объедините операции чтения JSON в Play 2.1

У меня 2 чтения. Один пользователь. Пользователь — это подмножество основного чтения под названием «Регистрация».

{
 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
}

Оформление: пакетные модели

импортировать play.api.libs.json._ импортировать play.api.libs.functional.syntax._

Регистрация класса case (пользователь: (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 _)
}

В конечном счете я хочу, чтобы пользователь был отдельным объектом. Я хочу иметь возможность использовать пользователя во многих других чтениях, поэтому он должен быть более модульным. Это возможно?

Бонус: может ли пользователь сериализовать каждое поле в отдельные переменные или хэш-карту вместо кортежа?


person Commander    schedule 04.04.2013    source источник


Ответы (1)


Вы можете извлечь User и снова использовать его где угодно:

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))
person Infinity    schedule 07.04.2013