在 Scala.js 中将 XMLHTTPRequest 读取为 Json

Read XMLHTTPRequest as Json in Scala.js

我正在使用 Scala.js 并想阅读从后端获取的 JSON。
我的问题是,我不知道如何处理我的 json 回复。 我找到的所有示例都使用 JSON.toJson(xhr.responseText) 但这只有在我得到一个字符串时才有效(对吗?)
我也不想解析对象中的 JSON(在这个例子中是用户) 我使用 Play-Framework 中的 Json 库。
Json 示例:

[
    {
        "name": "User1",
        "age": 18
    },
    {
        "name": "User2",
        "age": 18
    },
    {
        "name": "User3",
        "age": 18
    }
]

我的代码

 val xhr = new dom.XMLHttpRequest()
    xhr.open("GET", backend + "/ROUTE")
    xhr.responseType="json"
    xhr.onload = { (e: dom.Event) =>
       println(xhr.response) 
       //What i want
       // for (user<-response) println(user("age"),user("name")) 
    }
    xhr.send()

输出为

[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

我试过

val js=Json.obj("users"->xhr.response)

等等。

我想我误解了到底是怎么回事

 xhr.responseType="json"

有效但无法弄清楚。

我知道我会怎么做 "normal" 播放 json("name")

当您使用 responseType = "json" 时,您指示浏览器将响应解释为正常的 Javascript 对象。

在 scalasjs 术语中,这也是 js.Object 类型的值(参见 https://www.scala-js.org/doc/interoperability/types.html)。

更具体地说,当您收到一个 JSON 数组时,您可能会在 scalajs 中得到一个 js.Array[T]

import scala.scalajs.js

...

req.onload = { e: dom.Event =>
  if (js.Array.isArray(req.response)) {
    val array =  req.response.asInstanceOf[js.Array[js.Dynamic]]

    for (user <- array) {
      println(user.name)
    }
  }
}

您可以考虑这样做,而不是使用 responseType = "json"

req.onload = { e: dom.Event =>
  val r = js.JSON.parse(req.responseText)

  r match {
    case jsonlist: js.Array[js.Dynamic] =>
      for (user <- jsonlist) {
        println(user)
       }
    }
  }
}

然而,如果你想使用 play-json,你根本不想设置 responseType = "json",只需将它作为字符串传输并在其上调用 Json.parse

val json = Json.parse(req.responseText)

println((json \ 1 \ "name").as[String])