gpt4 book ai didi

javascript - 如何从单独的域请求 JSON 数据并自己使用它

转载 作者:行者123 更新时间:2023-12-02 23:23:07 25 4
gpt4 key购买 nike

  1. 我正在尝试使用“https://www.purpleair.com/json?show=13165 ”中的 JSON 数据并将该数据放在我的网站上。
  2. 我正在尝试访问 JSON 字段名称“Stats”,并且正在尝试获取子字段名称“\”v\“”。这是 Purpleair 提供的文档。 https://docs.google.com/document/d/15ijz94dXJ-YAZLi9iZ_RaBwrZ4KtYeCy08goGBwnbCU/edit (第二页)

我使用 XMLHttpRequest() 编写了代码。它说在 W3Schools你不能跨域,当我尝试使用 PHP 遵循他们的指示时,我迷路了。我不拥有 Purpleair.com

<!DOCTYPE html>
<html>
<head>
<title>Your Page Title</title>
</head>

<body>
<h1>Hello</h1>
<p id='demo'></p>
<script src="jsonp.php">
function reqListener() {
var myObj = JSON.parse(this.responseText);
document.getElementById("demo").innerHTML = myObj.stats
}
function loadData() {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "https://www.purpleair.com/json?show=13165");
oReq.send();
}
loadData()
</script>
</body>
</html>

最佳答案

请注意 Stats属性在其他 JSON 编码结果中进行 JSON 编码。

这是另一种处理方法,使用更现代的 fetch代替 XHR:

const getData = () =>
fetch('https://www.purpleair.com/json?show=13165')
.then(res => res.json())
.then(json => json.results)
.then(res => res.map(r => JSON.parse(r.Stats)))
.then(res => res.map(r => r.v))

getData()
.then(vs => document.getElementById('output').innerHTML = vs)
#output {background: yellow; padding: .25em}
<h1>Test</h1>
<p>Stats v values: <span id="output"></span>

更新:说明

有评论询问这是如何工作的。

首先,不幸的是命名上有一些重叠。 resresultresults是服务器调用结果的通用名称。 resres => res.json()代表了这一点。但是然后我们获取这个对象(我称之为 json ,诚然,这不是一个很好的名字;它也可能应该是 res ,但我们已经有过多的 res )并提取它的 results 。属性传递给下一个.then()称呼。我也称这个变量为res在下一个回调中。最后,最后一通电话.then()被愚蠢地命名了。应该是这样的:

    .then(stats => stats.map(s => s.v))

所以也可以这样写,

const getData = () =>
fetch('https://www.purpleair.com/json?show=13165')
.then(serverResponse => serverResponse.json())
.then(apiResultObject => apiResultObject.results)
.then(results => results.map(result => JSON.parse(result.Stats)))
.then(stats => stats.map(stat => stat.v))

所有then s 与 Promise API 有关。如果您不习惯它,那么绝对值得花一些时间进行研究。

两个map调用用于通过收集对每个元素运行给定函数的结果来将一个数组转换为另一个数组。所以

          results => results.map(result => JSON.parse(result.Stats))

表示对于数组中的每个元素 results ,我们将通过取 Stats 创建一个新元素属性(property)和运行JSON.parse在那个值上。然后我们将所有这些值放在一个新数组中。 JSON.parse获取API返回的字符串值并将其转换为JS对象。我们在这里需要这个,尽管我们已经对响应对象进行了 JSON 调用,因为响应的结构有点不寻常,其中这部分是双重编码的。

同样,这一行:

          stats => stats.map(stat => stat.v)

转换 stats 的数组对象放入包含其 v 的数组中属性。

关于javascript - 如何从单独的域请求 JSON 数据并自己使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56858684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com