【问题标题】:type mismatch; found : scala.collection.immutable.Stream[String] required: String in Play Scala?类型不匹配;发现:scala.collection.immutable.Stream[String] required: String in Play Scala?
【发布时间】:2016-06-14 19:34:55
【问题描述】:

我正在尝试使用 Play(2.2.x) 的 scala/anorm 显示来自数据库的 json 数据,如果我进行以下试验,我会收到如下错误:type mismatch; found : scala.collection.immutable.Stream[String] required: String,但如果我这样写:sql( ).map(row => rowString).toString - 正在提供 Stream 类型的 json 数据(我不需要它),那么我怎样才能得到我的普通 json 数据呢?请帮助我并提前致谢。

控制器:

class Test extends Controller {
    def getTest = Action { 
    var sql: SqlQuery = SQL("select name::TEXT from test");
    def values: String =  DB.withConnection { implicit connection => 
    sql().map(row => row[String]("name"))//giving error: type mismatch; found : scala.collection.immutable.Stream[String] required: String
    }
    Ok(values)
    }

【问题讨论】:

  • 你有一个Stream,一个懒惰的集合。第一个元素被评估,但任何其他元素都不是你得到?的原因。这表示可能仍有数据剩余。你看到的`是逃逸。不知道如何摆脱困境。
  • @Reactormonk,感谢您的回复,但这是存储在我的数据库中的唯一 json 对象(因此数据库中没有其他数据可用,我的意思是通常我们有 id,我不想要显示),我需要在点击查看页面上的 url 时显示,我的查询有什么错误吗?如何删除那些流/斜杠/?在我的 json 中?
  • 你有json还是Stream的json?
  • @Reactormonk,我得到的 json 如下: Stream("[{\"_testid\":{\"test0id\":\"123\"},{\"testtitle\":\ "123\"}"}]", ?) 。但我想要的 json 像:[{"__testid":{"test0id":"123"},{"testtitle":"123"}}]。我需要从我的json格式中删除斜杠/流/?有没有机会从我的 json 中删除所有这些?
  • 你从哪里得到的?这里有问题。 Stream("foo") 表示你有Stream[String],而不是String

标签: json scala scala-collections anorm


【解决方案1】:

您似乎正在使用 Anorm 进行数据库访问。如上面的 cmets 所述,执行 Anorm 查询会返回一个 Stream 而不仅仅是一个值。当您映射该值时,它再次返回StringStream,以便可以将结果作为流处理。这对于大型结果集非常有用,在这些结果集中增量处理流并将结果流式传输到客户端更有意义。看起来你才刚刚开始,所以你现在可能不想担心这个。

您可以通过简单地使用toList 将流中的结果转换为常规列表:

val resList = sql().map(row => row[String]("name")).toList

现在,您还需要取消转义字符串并将其作为 JSON 结果返回。这可以通过使用字符串插值来完成。为此,您只需将String 包围在StringContext 中并调用不带参数的s 方法。

val newResList = resList.map(s => StringContext(s).s())

最后,您实际上应该将 String 转换为 PlayJson JsValue 类型,以便您的控制器实际上返回正确的类型。

Json.parse(newResList.mkString("[",",","]")

mkString 方法用于将列表转换为有效的 JSON 字符串。您需要import play.api.libs.json.Json 才能使用。将JsValue 传递给Ok 可确保响应的mime 类型设置为“application/json”。您可以通过游戏here 了解有关使用 JSON 的更多信息。如果您打算构建 JSON 服务,这将很重要。

把它放在一起,你会得到以下结果:

class Test extends Controller {
  def getTest = Action { 
    var sql: SqlQuery = SQL("select name::TEXT from test");
    def values: JsValue =  DB.withConnection { implicit connection => 
      val resList = sql().map(row => row[String]("name")).toList 
      val newResList = resList.map(s => StringContext(s).s())
      Json.parse(newResList.mkString("[",",","]")
  }
  Ok(values)
}

您还可以使用以下替代结构来简化并摆脱相当草率的mkString 调用。

class Test extends Controller {
  def getTest = Action { 
    var sql: SqlQuery = SQL("select name::TEXT from test");
    def values: JsValue =  DB.withConnection { implicit connection => 
      val resList = sql().map(row => row[String]("name")).toList 
      Json.toJson(resList.map(s => Json.parse(StringContext(s).s())))
  }
  Ok(values)
}

这会解析列表中的每个 JSON 字符串,然后使用 Play 内置 JSON 库的功能再次将列表转换为 JsArray

【讨论】:

  • 感谢您的回复,我已经尝试了以上两种解决方案,但是两种解决方案出现相同的错误:类型不匹配;找到: play.api.libs.json.JsValue required: String (at lines: Json.parse(newResList.mkString("[",","]")) 用于第一个解决方案和 Json.toJson(resList.map (s => Json.parse(StringContext(s).s()))) 为第二个解决方案,请告诉我,如何更改?
  • 我在上面更新了。值的类型需要是 JsValue 而不是 String。现在就试试吧。
  • 如果我运行第一个解决方案,出现错误:[JsonParseException: Unexpected character ('' (code 95)): was expected comma to separate ARRAY entries at [Source: java.io. StringReader@446705b0; line: 1, column: 7]] 如果我运行第二个解决方案,得到:[JsonParseException: Unexpected character ('' (code 95)): expected a valid value (number, String, array, object, 'true'、'false' 或 'null')在 [来源:java.io.StringReader@6403f91a; line: 1, column: 6]] 在上述相同的行。请告诉我,
  • 失败的原因是您的 JSON 无效。至少您在上面粘贴的内容 - [{"__testid":{"test0id":"123"},{"testtitle":"123"}}] 将无法正确解析。一个有效的版本是这样的 [{"__testid":[{"test0id":"123"},{"testtitle":"123"}]}] 你不能有两个用逗号分隔的对象而不使它们数组。如果这是另一个具有两个属性的对象,则以下内容是正确的 – [{"__testid":{"test0id":"123","testtitle":"123"}}]
  • Mongo 的 JSON 解析器可能比 Play 或 PostgreSQL 的更宽容。上面的例子,在正式意义上,是无效的。希望这对您有所帮助。
猜你喜欢
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 2015-04-03
  • 2015-12-03
  • 1970-01-01
相关资源
最近更新 更多