异常模式匹配和弃用的列表方法
Anorm Pattern Matching and deprecated list method
我正在使用 PlayFramework 和 Anorm 来构建一个带有 JSON 数据的 REST 服务。
因为我事先不知道所有的数据库列,所以我使用模式匹配将 Row 映射到 JSON 对象。
我使用文档 (Using-Pattern-Matching) 中的示例作为起点。
def any2jsValue(v: Any): JsValue = v match {
case v2: String => JsString(v2)
case v2: Long => JsNumber(v2)
case v2: Int => JsNumber(v2)
case v2: Double => JsNumber(v2)
case v2: Float => JsNumber(v2)
case v2: Some[Any] => any2jsValue(v2.get)
case None => JsNull
case v2: Any => JsString("MAPPING NOT IMPLEMENTED: " + v2.getClass() + " Value: " + v2.toString)
}
def row2jsObject(row: Row): JsObject = row.asMap.map({
case (k: String, v: Any) => Json.obj(k -> any2jsValue(v))
}).foldLeft(Json.obj())((r: JsObject, c: JsObject) => r ++ Json.obj(c.keys.head -> c.values.head))
val sql = SQL("SELECT * FROM world.City WHERE name = 'Milano'")
val cities = sql.map({
case row: Row => row2jsObject(row)
}).list
Json.obj("cities" -> cities)
代码工作正常,但编译器警告我:
method list in class SimpleSql is deprecated: Use SQL("...").as(parser.*)
如何在不使用已弃用的列表方法的情况下完成相同的工作?
我已经尝试在 API 中实现解析器和搜索替代方法,但都没有成功。
不使用已弃用的 .list
,必须定义 RowParser
并与 .*
组合器一起使用;例如:
import java.sql.Connection
import anorm._
trait Country
case class SmallCountry(name:String) extends Country
case class BigCountry(name:String) extends Country
case object France extends Country
val patternParser = RowParser[Country] {
case Row("France", _) => Success(France)
case Row(name:String, pop:Int) if (pop > 1000000) => Success(BigCountry(name))
case Row(name:String, _) => Success(SmallCountry(name))
case row => Error(TypeDoesNotMatch(s"unexpected: $row"))
}
def countries(implicit con: Connection): List[Country] =
SQL("SELECT name,population FROM Country WHERE id = {i}").
on("i" -> "id").as(patternParser.*)
你的情况:
import anorm.{ RowParser, SqlResult, Success }
def row2jsObject(row: Row): SqlResult[JsObject] = Success(row.asMap.map({
case (k: String, v: Any) => Json.obj(k -> any2jsValue(v))
}).foldLeft(Json.obj())((r: JsObject, c: JsObject) => r ++ Json.obj(c.keys.head -> c.values.head)))
val parser: RowParser[JsObject] = RowParser(row2jsObject(_))
val cities: List[JsObject] =
SQL("SELECT * FROM world.City WHERE name = 'Milano'").as(parser.*)
我正在使用 PlayFramework 和 Anorm 来构建一个带有 JSON 数据的 REST 服务。
因为我事先不知道所有的数据库列,所以我使用模式匹配将 Row 映射到 JSON 对象。
我使用文档 (Using-Pattern-Matching) 中的示例作为起点。
def any2jsValue(v: Any): JsValue = v match {
case v2: String => JsString(v2)
case v2: Long => JsNumber(v2)
case v2: Int => JsNumber(v2)
case v2: Double => JsNumber(v2)
case v2: Float => JsNumber(v2)
case v2: Some[Any] => any2jsValue(v2.get)
case None => JsNull
case v2: Any => JsString("MAPPING NOT IMPLEMENTED: " + v2.getClass() + " Value: " + v2.toString)
}
def row2jsObject(row: Row): JsObject = row.asMap.map({
case (k: String, v: Any) => Json.obj(k -> any2jsValue(v))
}).foldLeft(Json.obj())((r: JsObject, c: JsObject) => r ++ Json.obj(c.keys.head -> c.values.head))
val sql = SQL("SELECT * FROM world.City WHERE name = 'Milano'")
val cities = sql.map({
case row: Row => row2jsObject(row)
}).list
Json.obj("cities" -> cities)
代码工作正常,但编译器警告我:
method list in class SimpleSql is deprecated: Use
SQL("...").as(parser.*)
如何在不使用已弃用的列表方法的情况下完成相同的工作?
我已经尝试在 API 中实现解析器和搜索替代方法,但都没有成功。
不使用已弃用的 .list
,必须定义 RowParser
并与 .*
组合器一起使用;例如:
import java.sql.Connection
import anorm._
trait Country
case class SmallCountry(name:String) extends Country
case class BigCountry(name:String) extends Country
case object France extends Country
val patternParser = RowParser[Country] {
case Row("France", _) => Success(France)
case Row(name:String, pop:Int) if (pop > 1000000) => Success(BigCountry(name))
case Row(name:String, _) => Success(SmallCountry(name))
case row => Error(TypeDoesNotMatch(s"unexpected: $row"))
}
def countries(implicit con: Connection): List[Country] =
SQL("SELECT name,population FROM Country WHERE id = {i}").
on("i" -> "id").as(patternParser.*)
你的情况:
import anorm.{ RowParser, SqlResult, Success }
def row2jsObject(row: Row): SqlResult[JsObject] = Success(row.asMap.map({
case (k: String, v: Any) => Json.obj(k -> any2jsValue(v))
}).foldLeft(Json.obj())((r: JsObject, c: JsObject) => r ++ Json.obj(c.keys.head -> c.values.head)))
val parser: RowParser[JsObject] = RowParser(row2jsObject(_))
val cities: List[JsObject] =
SQL("SELECT * FROM world.City WHERE name = 'Milano'").as(parser.*)