加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何在Play 2中从ReactiveMongo返回JSON的枚举器

发布时间:2020-12-16 18:30:33 所属栏目:安全 来源:网络整理
导读:在我们的项目中,我们使用ReactiveMongo和Play 2.2.1. 问题是,ReactiveMongo返回的Enumerator [A]形式的数据流实际上是一个值对象流,它们没有逗号分隔,也没有流开始和结束注释,可以对待作为数组打开和关闭语句. 这为JSON使用者JS客户端带来了问题,因为预期的
在我们的项目中,我们使用ReactiveMongo和Play 2.2.1.

问题是,ReactiveMongo返回的Enumerator [A]形式的数据流实际上是一个值对象流,它们没有逗号分隔,也没有流开始和结束注释,可以对待作为数组打开和关闭语句.

这为JSON使用者JS客户端带来了问题,因为预期的格式是
[A1,A2,…]

所以我们跳入了箍,并将我们的Enumeratee [A]转换为Enumerator [String],并检查它是否是第一个元素:

var first:Boolean = true
    val aToStrs = (as.map(a => {
        if(first) {
            first = false;
            Json.stringify(Json.toJson(a))
        } else {
            "," + Json.stringify(Json.toJson(a))
        }
   }))
   Ok.chunked(
       Enumerator.enumInput(Input.El("[")) andThen
       aToStrs andThen
       Enumerator.enumInput(Input.El("]")) andThen
       Enumerator.enumInput(Input.EOF)
   )

这有效,但感觉就像发明轮子一样.

对于这个常见问题,有没有更好的解决方案?

解决方法

如果你使用comet或EventSource,你不必手工制作生成输出的方法,你也可以实际解析客户端中项目的响应项.响应数组将强制您编写自己的解析代码或等到所有内容都到达客户端,然后才能在JavaScript中使用build int JSON解析器.

使用EventSource协议进行流式传输非常简单,您应该可以执行以下操作:

implicit val cometEncoder = new Comet.CometMessage[JsValue](_.toString)
Ok.chunked(yourEnumerator &> EventSource()).as(EVENT_STREAM)

然后在客户端html:

<script type="text/javascript">
  var es = new EventSource(jsRouter.controllers.Application.streamIt().url)

  es.addEventListener("message",function (event) {
    var item = JSON.parse(event.data)
    // ... do something with the json value ...
  })
</script>

在你可能想要查看的播放示例项目中有一个这样的示例:$YOUR_PLAY_DIR / samples / scala / eventsource-clock /

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读