2012-05-26 6 views
4

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

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)) 

Благодаря

ответ

3

Как уже говорилось, вы можете написать у вас есть неявные Записывает сделать что, но вы также можете полагаться на существующие сочиняет и просто получить данные как 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 *) 
} 
+0

Спасибо, что, кажется, работает. Как вы работаете с нулевыми столбцами? Скажем, я добавляю возраст, если я это делаю, тогда, когда я забегу в Json, он вернется как строка «Нет», когда я хочу, чтобы он был нулевым. '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 => Карта ("id" -> id.get.toString, "uid" -> uid.toString, "api_key" -> api_key.toString, "age" -> age.toString) }} ' – dhrod5

+0

используйте случай соответствия, чтобы узнать, нужно ли добавить поле« возраст »на карту. Если ответ одобрен для вас, отметьте его принятым. – iwalktheline

+0

Я думаю, что понял. вместо того, чтобы делать age.toString, вы можете сделать toJson (возраст), и он превратит его в соответствующий JsValue. – dhrod5