4

このサイトのコードを (少し変更して)試していたところ、結果がInt.

class NeoService(rootUrl: String) {
    def this() = this("http://default/neo/URL/location/db/data")


    val stdHeaders = Seq(
        ("Accept", "application/json"), 
        ("Content-Type", "application/json") 
    )

    def executeCypher(query: String, params: JsObject) : Future[Response] = {
        WS.url(rootUrl + "/cypher").withHeaders(stdHeaders:_*).post(Json.obj(
            "query" -> query,
            "params" -> params
        ))
    }

    def findNode(id: Int) : Future[Option[Int]] = {
        val cypher = """
          START n=node({id})
          RETURN id(n) as id
       """.stripMargin

        val params = Json.obj("id" -> id)

        for (r <- executeCyhper(cypher, params)) yield {
            val data = (r.json \ "data").as[JsArray]
            if (data.value.size == 0)
               None
            else
               Some(data.value(0).as[JsArray].value(0).as[Int])
        }
    }
}

有効な ID を渡すと、次のfindNode()エラーが表示されます。

[JsResultException: JsResultException(errors:List((,List(ValidationError(validate.error.expected.jsnumber,WrappedArray())))))]

行で、Some(data.value(0).as[JsArray].value(0).as[Int])存在しないIDを渡すと、次のエラーが発生します。

[JsResultException: JsResultException(errors:List((,List(ValidationError(validate.error.expected.jsarray,WrappedArray())))))]

ラインでval data = (response.json \ "data").as[JsArray]

このようなものを渡すだけの場合Int:

... else 
        Some(10)...

それは正常に動作します。何が起こっているのか、エラーメッセージが何を伝えようとしているのかわかりません。

4

1 に答える 1

5

このメッセージが伝えているのは、あなたが提供した JSON が期待するタイプで解析できないということです。

最初のものは約Some(data.value(0).as[JsArray].value(0).as[Int])です。明らかdata.value(0).as[JsArray].value(0)に Number ではないため、Int に変換できません。

2 つ目についてはval data = (response.json \ "data").as[JsArray]、id が存在しないため、取得した Json にキー「データ」がないか、そのキーの値が配列ではありません (null ?)。

解析する前に r.json の値を記録することをお勧めします。失敗する理由が正確にわかります。asまた、validate の使用を避け、代わりに使用する必要があります ( http://www.playframework.com/documentation/2.1.2/ScalaJsonRequests )。

于 2013-08-01T12:13:03.520 に答える