2013-04-26 13 views
0

我使用playframework 2.1.0與Anorm來查詢數據庫。 我想要將結果序列化爲json而不經過任何臨時對象/案例類。Playframework任何向Json - usecase:anorm查詢結果給Json

這是流動的樣子: 使用ANORM:

DB.withConnection { implicit c => 
    val q = SQL(""" long query goes here """) 
    q().toList 
} 

然後我拿這個結果和改造它一個列表[SqlRow]列出[地圖[字符串,任何]。 字符串,任何是列名,值(對象/不限)

val asMap = info.toList.map(row => scala.collection.immutable.Map(row.asMap.toSeq:_*)) 

的我想jsonize此。

我試過一些json庫:GSON,spray-json,playframework json lib。 但他們都沒有開箱即用。 我試圖用一些模式匹配來爲任何類型編寫隱式寫入器,但問題是這位作者總是超過所有其他寫入,所以json無法正確生成。

建議? 你會如何建議將Anorm的結果轉換爲Json?沒有任何臨時域模型。

回答

0

使用FlexJson找到了一個解決方案,而不是最好的解決方案。
令人討厭的是,FlexJson不是非常面向Scala的,因此scala集合和一些scala類型需要轉換爲等效的Java類型。

val info:List[SqlRow] = loadInfoFromDB using Anorm 
//transform scala maps to java maps 
val asMap: List[util.Map[String, Any]] = info.toList.map(row => JavaConversions.mapAsJavaMap(row.asMap)) 
//create the basic FlexJson serializer 
val flexJson: JSONSerializer = new flexjson.JSONSerializer() 
//register a Option transformer so it can serialize Options correctly 
flexJson.transform(new flexjson.transformer.AbstractTransformer { 
    def transform(`object`: Any) { 
    `object`.asInstanceOf[Option[_]] match { 
     case None => getContext.write("null") 
     case Some(b:Any) => getContext.transform(b) 
    } 
    } 
},classOf[Option[_]]) 
//finally convert the scala List to java List and use this serializer on it. 
val infoJsn: String = flexJson.deepSerialize(JavaConversions.seqAsJavaList(asMap)) 
+0

我開始喜歡這個flexjson庫:)有了一些額外的scala map/list變形金剛註冊,你不需要將這個scala預轉換爲java類型。把所有這些放在一個返回JSonSerializer的「工廠」方法中,並且你有一個完整的可操作的簡單的json序列化程序,它可以工作! – samz 2013-04-29 15:06:49