在 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])
我正在使用 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])