我正在编写服务器,在我的数据库上执行任何选择查询并返回json。我已经完成了大部分任务,但我坚持将可以为空的列解析为字符串。
val result = SQL("SELECT * FROM Table limit 5;")().map(_.asList.map({_.toString})).toList
val jsonResp = Json.toJson(result)
如果列可以具有空值字符串Some(123)而不是123,则会生成。我尝试使用match
但是我没有使用compose该命令。也许你有一些类似的问题,你知道如何处理这种反应?
修改 我通过添加模式匹配取得了一些进展:
val result = SQL(query)()
.map(_.asList.map(
{
case Some(s) => s.toString
case None => ""
case v => v.toString
}
)).toList
但我不确定这是解决这个问题的好方法。还在等待想法
答案 0 :(得分:1)
Anorm支持可空列作为可选值。
您将行返回为原始值列表。最好使用解析器API来指示如何正确提取值。 E.g。
SQL("SELECT a, b, c ...").as(get[Option[String]]("a") ~ int("b") ~ str("c) map { case a ~ b ~ c => MyClass(a, b, c) }.*)
以MyClass
列表的形式返回SQL结果,其中属性为Option[String]
,Int
和String
。
Anorm文档还有很多其他的例子。
答案 1 :(得分:-1)
最好将数据库中的可选条目映射到json中的可选字段;大多数scala json库将适当地呈现具有Option类型的字段。你想要将一个整数值渲染为json的字符串似乎很奇怪 - json对于整数有一个非常好的数字类型。
如果您肯定希望以这种方式将Option[Int]
转换为字符串,最明确的方式可能是o.map(_.toString).getOrElse("")
;因此,您可以编写_.asList.map{_.map{_.toString}.getOrElse("")}
而不是模式匹配。我不太了解特定的SQL库,无法知道结果是否静态地知道是否为Option类型;如果值的类型为Any
,那么您可能需要按照您的方式匹配选项和非选项。