【问题标题】:parse fetch() JSON response output Nodejs vs. parse JSON variable解析 fetch() JSON 响应输出 Nodejs 与解析 JSON 变量
【发布时间】:2021-10-15 21:15:06
【问题描述】:

我有一个非常新的问题,希望有人可以帮助我。我希望有人可以向我解释解析变量 JSON 对象与解析 fetch() 响应数据 JSON 对象之间的区别,后者将其放入变量中。例如:

如果我有这样的变量:

var myJSON = 
{
  "items" : [ {
    "id" : "T0lDX0J1aWxkX0FydGlmYWN0czpmODk4YjM5MDNjYjk5YzU5NjgzNTk3ZWRjNWFmZjliYw",
    "repository" : "Build_Artifacts",
    "format" : "raw",
    "group" : "/",
    "name" : "05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
    "version" : null,
    "assets" : [ {
      "downloadUrl" : "http://localhost:8081/repository/Build_Artifacts/05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
      "path" : "05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
      "id" : "T0lDX0J1aWxkX0FydGlmYWN0czphNDc1N2JjYWE2MmI2MzA2MDdlMTA1NGE4NTk1MDQ1OQ",
      "repository" : "Build_Artifacts",
      "format" : "raw",
      "checksum" : {
        "sha1" : "040e517528c05ca335a38e98c7ab8673773314bd",
        "sha512" : "652e624873da778dce4bc417cacfead12bdd2ad01e9f7f77cba80270caa0f99caa09d4fb53f584a4da9991186f78bd7b55da1e4ed3f22e026b8333dd332b3b83",
        "sha256" : "b66805d15702505f708b90f6e1169c79390d59b9f8cadc9ab1852f48eeabbfe2",
        "md5" : "60fdd406e026330c2cfbec3e15e05414"
      }
    } ]
  }]
}

然后我可以通过以下方式解析它:

console.log(myJSON.items[0].name)
// Output is as follows:
// 05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip

但是,如果我从 fetch 中获得完全相同的 JSON 并将其放入如下变量中:

const fetch = require("node-fetch");
const asset = 'Build_Artifacts'
const url2 = 'http://localhost:8081/service/rest/v1/components?repository='
const myHeaders = {
    "Authorization": "Basic token",
    "Content-Type": "application/json",
};

const requestOptions = {
    method: 'GET',
    headers: myHeaders,
    redirect: 'follow'
}


const getData = async () => {
    const res = await fetch(url2 + asset, requestOptions);
    const myJSON = await res.json()
    //console.log(myJSON)
    return myJSON
}
getData().then(res = (myJSON) => {
    console.log(myJSON.items[0].name)

})

// Output is as follows:
// UnhandledPromiseRejectionWarning: TypeError: Cannot read property '0' of undefined

我意识到 fetch() 是异步的,因此它以承诺的形式返回响应。我也读过响应数据是流的形式。有人可以确认我的提取输出是否因为我正在尝试解析流数据而未定义吗?如果是这种情况,那么有人可以提供一个小例子来说明我如何获取数据并解析它以仅检索我想要查看的数据吗?

【问题讨论】:

  • console.log(myJSON)getData()getData().then() 中返回什么?
  • res = .then(res = (myJSON) => { ... }) 中做什么?错误表明myJSON.itemsundefined,所以它可能不是您所期望的。
  • 我只是用它来表示我将在从 getData 中提取整个 JSON 有效负载后对数据做一些事情,例如解析 myJSON .....即使我删除了整个 ".然后”并尝试从 getData() 解析它我仍然想出了相同的“未定义”响应....

标签: javascript node.js api fetch response


【解决方案1】:

看起来以下似乎正在工作:

const getData = async () => {
    const res = await fetch(url2 + asset, requestOptions);
    const myJSON = await res.text()
    return myJSON
}

getData().then(function (result) {
    const resultArr = [];
    const outObjA = JSON.parse(result);
        for (let i=0; i < outObjA.items.length; i++) {
            const fileName = outObjA.items[i].name
            resultArr.push(fileName)
        }
    console.log(resultArr)
    }).catch(error => {
        console.log('Error:', error)
  })

for 循环允许我遍历所有 items.name 的整个 JSON 响应并将它们转储到 resultArr 数组中。

【讨论】:

    【解决方案2】:

    这样做怎么样?

    fetch(url2 + asset, requestOptions).then(response => response.json()).then(data => {res = data;})
    

    另见here

    【讨论】:

      【解决方案3】:

      您可以将 myJson 变量修改为如下格式:

      var myJson = [{items: {...}}]
      

      【讨论】:

      • 很抱歉,这似乎是一个愚蠢的问题,但响应的格式似乎很好,即有效的 JSON....它正在解析我遇到困难的响应。你是说如果我像上面那样格式化我的“myJSON”变量,它会在响应进来时解析它?
      猜你喜欢
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2020-03-04
      • 2016-06-24
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多