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.

0 件のコメント:

コメントを投稿