2011年11月17日木曜日

play-scala using Gson

I find out how to return data in JSON format using the play-scala.
In the play-scala around the handle JSON can present a very bad,
such as lift-json, prefer to work well with other libraries.

so I try to experiment,googl-served to keep a record so the easiest Gson.


1.create play application

$ play new jsonsample --with scala


2.get Gson lib

use dependency management eatures in play.

conf/dependencies.yml
# Application dependencies

require:
    - play
    - play -> scala 0.9
    - com.google.code.gson -> gson 1.7.1

and then,execute deps command.

$ cd jsonsample
$ play deps
available Gson.


3.create Controller

To create a Controller that will be returned in the Json format data from the default index method.

import com.google.gson.Gson

def index = {
    val gson: Gson = new Gson()
    val array = new Array[String](3)
    array(0) = "apple"
    array(1) = "orange"
    array(2) = "banana"
    Json(gson.toJson(array))  
}
the array returned in JSON format.
["apple","orange","banana"]

Map case.
※conversion from Scala Map to java.util.Map

import com.google.gson.Gson
import scala.collection.JavaConversions._

 def index = {
    val gson: Gson = new Gson()
   var map = Map("key1"->"val1", "key2"->"val2")
   val jMap: java.util.Map[String, String] = map
   Json(gson.toJson(jMap))  
  }

result is
{"key1":"val1","key2":"val2"}


Object in List case.
package controllers

import com.google.gson.Gson
import java.util.List
import java.util.ArrayList
import scala.collection.JavaConversions._

object Application extends Controller {

  def index = {
    val gson: Gson = new Gson()

    val user1 = Person("syuta",30)
    val user2 = Person("taro",20)

    val s1 = Skill("Java","Program language")
    val s2 = Skill("Scala","Program language")
    val s3 = Skill("MySQL","Database")
      
    val list1 = new ArrayList[Skill]
    list1.add(s1)
    list1.add(s2)
    list1.add(s3)
    
    user1.skills = list1

    val list2 = new ArrayList[Skill]
    list2.add(s2)
    list2.add(s3)

    user2.skills = list2

    val str1 = gson.toJson(user1)
   println(str1)

   val str2 = gson.toJson(user2)
   println(str2)
   
   val resList:List[Person] = new ArrayList[Person]()
    resList.add(user1)
    resList.add(user2)


    Json(gson.toJson(resList))
  }

}

case class Person(var name: String,var age: Int) {
  var skills:List[Skill] = _
}

case class Skill(var name: String,var category:String)

result is
[{"name":"syuta","age":30,"skills":[{"name":"Java","category":"Program language"},{"name":"Scala","category":"Program language"},{"name":"MySQL","category":"Database"}]},{"name":"taro","age":20,"skills":[{"name":"Scala","category":"Program language"},{"name":"MySQL","category":"Database"}]}]
no problem case class.