【问题标题】:Playframework Any to Json - usecase: anorm query result to JsonPlayframework Any to Json - 用例:异常查询结果到 Json
【发布时间】:2013-04-20 12:49:44
【问题描述】:

我正在使用带有 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:_*))

我想把这个json化。

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

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

【问题讨论】:

    标签: json serialization playframework playframework-2.1 anorm


    【解决方案1】:

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

    【讨论】:

    • 我开始喜欢这个 flexjson 库了 :) 通过额外注册 scala 映射/列表转换器,您不需要将 scala 预先转换为 java 类型。只需将所有这些放在返回 JSonSerializer 的“工厂”方法中,您就有了一个完全可操作的简单 json 序列化器!
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 2016-05-06
    • 1970-01-01
    • 2018-09-17
    • 2016-09-01
    • 2013-02-24
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多