0

我正在使用带有 Anorm 的 playframework 2.1.0 来查询数据库。我想将结果序列化为 json 而不通过任何临时对象/案例类。

这就是流程的样子:使用异常:

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

然后我将这个结果从 List[SqlRow] 转换为 List[Map[String,Any]]。String,Any是列名,值(Object/Any)

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

我想对此进行 jsonize 处理。

我尝试了一些 json 库:GSON、spray-json、playframework json 库。但是它们似乎都不适用于开箱即用的 Any 。我尝试使用一些模式匹配为 Any 类型编写隐式编写器,但问题是该编写器总是超过所有其他写入,因此无法正确生成 json。

建议?您如何建议将结果从 Anorm 转换为 Json?没有任何临时域模型。

4

1 回答 1

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))
于 2013-04-26T15:11:56.570 回答