小编hea*_*jnr的帖子

播放 Json 递归读取

我正在使用一个 API,该 API 在响应中的多个层公开一个对象。例如,对于某些响应,我们会返回一个:

{ 
  "error": { 
    "code": "123", 
    "description": "Description" 
  } 
}
Run Code Online (Sandbox Code Playgroud)

但在其他情况下,它会响应:

{
  "data": [
    {
      "message_id": "123",
      "error": {
        "code": "123",
        "description": "Description"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,错误对象都是相同的,而且在这两种情况下,我实际上都不关心负载的其余部分。我希望使用 \\ 递归 JsPath 运算符,但是下面的实现失败了:

case class ErrorMessage(code: String, description: String)
implicit val errorMessageFormat = Json.format[ErrorMessage]

case class ErrorResponse(errors: Seq[ErrorMessage])
implicit val errorResponseFormat: Format[ErrorResponse] = Format(
  (__ \\ "error").read[Seq[ErrorMessage]].map(ErrorResponse),
  (__ \ "errors").write[Seq[ErrorMessage]].contramap((r: ErrorResponse) => r.errors)
)
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误:

JsError(List((//error,List(ValidationError(List(error.expected.jsarray),WrappedArray())))))
Run Code Online (Sandbox Code Playgroud)

我明白为什么:(__ \\ "error")返回 a Seq[JsValue],而我的 read 调用期望 a JsArray …

recursion json scala playframework

5
推荐指数
1
解决办法
760
查看次数

Scala - 按顺序依次执行任意数量的Futures

我正在试图找出按序列执行一系列期货的最佳方式,其中一个Future的执行取决于之前的.我试图为任意数量的期货做这件事.

用户案例:

  • 我从我的数据库中检索了许多ID.
  • 我现在需要检索Web服务上的一些相关数据.
  • 一旦我找到了有效的结果,我想停止.
  • 我只关心成功的结果.

并行执行这些并且然后解析返回的结果集合不是一种选择.我必须一次执行一个请求,并且只有在前一个请求没有返回任何结果时才执行下一个请求.

目前的解决方案是沿着这些方向.使用foldLeft执行请求,然后仅在前一个未来满足某些条件时评估下一个未来.

def dblFuture(i: Int) = { i * 2 }
val list = List(1,2,3,4,5)
val future = list.foldLeft(Future(0)) {
  (previousFuture, next) => {
    for {
      previousResult <- previousFuture
      nextFuture <- { if (previousResult <= 4) dblFuture(next) else previousFuture }
    } yield (nextFuture)
  }
}
Run Code Online (Sandbox Code Playgroud)

这方面的一个重大缺点是:a)我一直处理所有项目,即使我得到了一个我很满意的结果,并且b)一旦我找到了我想要的结果,我就会继续评估谓词.在这种情况下,它是一个简单的if,但实际上它可能更复杂.

我觉得我错过了一个更优雅的解决方案.

scala future sequential for-comprehension foldleft

1
推荐指数
1
解决办法
1644
查看次数