Список в Json в Playframework Scala

Я новичок в scala и в playframework, но пока все отлично. Мне трудно понять, как превратить список данных в json (или любую сложную структуру). Это не реальный пример, но вот что я пытаюсь сделать. Получить некоторые данные из базы данных.

scala> val result:List[(Long,String)] = DB.withConnection { implicit c => 
    SQL("select * from users").as(
     long("id")~str("uid") map(flatten)*)
  }
 result: List[(Long, String)] = List((3,397a73ee5150429786863db144341bb3), (4,2850760dc9024c16bea6c8c65f409821), (5,636ee2bf758e4f699f27890ac55d7db2))

Я хотел бы затем превратить это в json и вернуть его. на основе этого документа похоже, что мне нужно выполнить итерацию и вызвать toJson для результата

http://www.playframework.org/documentation/2.0/ScalaJson

Но на практике у меня возникают проблемы с этим. Это вообще правильный подход? Есть ли какая-то концепция scala, которая упростит это? Я видел несколько примеров с использованием case-классов, но я еще не совсем понял эту концепцию.

Я действительно не ожидаю, что это сработает, но, думаю, я концептуально пытаюсь сделать что-то подобное

scala> toJson(Map("response" -> result))
<console>:27: error: No Json deserializer found for type     scala.collection.immutable.Map[java.lang.String,List[(Long, String)]]. Try to implement an     implicit Writes or Format for this type.
          toJson(Map("response" -> result))

Спасибо


person dhrod5    schedule 26.05.2012    source источник


Ответы (1)


Как уже говорилось, вы можете написать свои собственные неявные записи для этого, но вы также можете полагаться на существующие записи и просто получить свои данные как List[Map[String, Any]] и применить к ним toJson:

val simple = {
    get[Pk[Long]]("user.id") ~
    get[Long]("user.uid") map {
        case id~uid => Map("id" -> id.get.toString, "uid" -> uid.toString)
    }
}
val result:List[Map(String,String)] = DB.withConnection { implicit c => 
    SQL("select * from users").as(User.simple *)
}
person kheraud    schedule 27.05.2012
comment
Спасибо, вроде работает. Как вы справляетесь с нулевыми столбцами? Скажем, я добавляю возраст, если я сделаю это так, то, когда я запущу toJson, он вернется как строка None, когда я хочу, чтобы она была нулевой val simple = { get[Pk[Long]]("users.id") ~ get[String]("users.uid") ~ get[Long]("apiKey_id") ~ get[Option[Long]]("age") map { case id~uid~api_key~age => Map("id" -> id.get.toString, "uid" -> uid.toString, "api_key" -> api_key.toString, "age" -> age.toString ) } } - person dhrod5; 27.05.2012
comment
используйте случай совпадения, чтобы узнать, нужно ли вам добавить поле возраста на карту. Если ответ вас устраивает, отметьте его принятым. - person kheraud; 28.05.2012
comment
Думаю, я понял это. вместо age.toString вы можете сделать toJson(age), и он превратит его в соответствующий JsValue. - person dhrod5; 28.05.2012