Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 类型失配;找到:scala.collection.immutable.Stream[String]必需:播放scala中的字符串?_Json_Scala_Scala Collections_Anorm - Fatal编程技术网

Json 类型失配;找到:scala.collection.immutable.Stream[String]必需:播放scala中的字符串?

Json 类型失配;找到:scala.collection.immutable.Stream[String]必需:播放scala中的字符串?,json,scala,scala-collections,anorm,Json,Scala,Scala Collections,Anorm,我试图使用Play(2.2.x)的scala/anorm显示数据库中的json数据,如果我进行以下尝试,我会得到如下错误:类型不匹配;发现:scala.collection.immutable.Stream[String]required:String,但如果我像这样编写:sql().map(row=>rowString).toString-提供的是流类型的json数据(我不需要它),那么我如何为它获取正常的json数据呢?请帮助我并提前感谢我 控制者: class Test extends C

我试图使用Play(2.2.x)的scala/anorm显示数据库中的json数据,如果我进行以下尝试,我会得到如下错误:
类型不匹配;发现:scala.collection.immutable.Stream[String]required:String
,但如果我像这样编写:sql().map(row=>rowString).toString-提供的是流类型的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)
    }

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

只需使用
toList
,即可将流的结果转换为常规列表:

val resList = sql().map(row => row[String]("name")).toList
现在,还需要取消对字符串的scape,并将其作为JSON结果返回。这可以通过使用字符串插值来实现。为此,只需将
字符串
包围在
StringContext
中,并调用
s
方法,不带任何参数

val newResList = resList.map(s => StringContext(s).s())
最后,您实际上应该将字符串转换为PlayJson JsValue类型,以便您的控制器实际返回正确的类型

Json.parse(newResList.mkString("[",",","]")
mkString
方法用于将列表转换为有效的JSON字符串。您需要
导入play.api.libs.json.json
才能工作。将
JsValue
传递给
Ok
可确保响应的mime类型设置为“application/json”。您可以了解更多关于在play中使用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

您拥有的是一个
流,一个惰性集合。第一个元素会被计算,但任何其他元素都不会被计算,这就是为什么会得到
。这意味着可能还有数据。你看到的``是逃跑。我不知道如何取消搜索。@Reactormonk,谢谢你的回复,但这是我数据库中存储的唯一json对象(所以数据库中没有其他数据可用,我的意思是通常我们有id,我不想显示),我需要在点击查看页面的url时显示,我的查询中有错误吗?如何删除这些流/斜杠/?在我的json中?你有json还是json的
Stream
?@reactormank,我得到的json类似于:Stream(“[{\”\u testid\”:{\“test0id\”:\“123\”),,?)。但是我想要的json类似于:[{\\\\\\\\ \u testid:“{”test0id:“123”,{“testtitle:“123”}]。我需要从我的json格式中删除斜杠/Stream/?。我不确定它是否是json流(因为我不知道Stream json),但我相信我已经并且只需要返回正常的json。那么,有没有机会从我的json中删除所有斜杠/Stream/?呢?你从哪里得到的?这里有问题。
Stream(“foo”)
表示您有
Stream[String]
,而不是
String
。感谢您的回复,我尝试了上述两种解决方案,但我在两种解决方案中得到了相同的错误:类型不匹配;发现:play.api.libs.json.JsValue required:String(在第行:json.parse(newResList.mkString(“[”,“,”,“,“]),第一个解决方案和json.toJson)(resList.map(s=>Json.parse(StringContext(s).s()))对于第二个解决方案,请让我知道,需要更改什么?我在上面更新了。值的类型需要是JsValue而不是字符串。请现在尝试一下。如果我运行第一个解决方案,会得到错误:[JsonParseException:意外字符(“”(代码95)):应使用逗号分隔[Source:java.io]处的数组项。StringReader@446705b0;第1行,第7列]]如果我运行第二个解决方案,得到:[JsonParseException:意外字符(“”(代码95)):在[来源:java.io。StringReader@6403f91a;第1行,第6列]]位于上述同一行。请让我知道,它失败的原因是因为您的JSON无效。至少您在上面粘贴的内容-[{{testid:{test0id:“123”},{“testtitle:“123”}]将无法正确解析。此内容的有效版本类似于[{{testid:[{”test0id“:“123”},{“testtitle”:“123”}]}]如果不将两个对象作为数组,则不能将它们用逗号分隔。如果这是另一个具有两个属性的对象,则以下命令是正确的–[{“\uu testid”:{“test0id”:“123”,“testtitle”:“123”}]Mongo的JSON解析器可能比Play或PostgreSQL更宽容。上面的示例在形式上是无效的。希望这一切都有帮助。