【问题标题】:Fetch and join JSON objects from multiple API calls从多个 API 调用中获取和连接 JSON 对象
【发布时间】:2020-05-09 08:27:58
【问题描述】:

对不起,如果我的英语不好,如果你不明白,请写评论(我会编辑帖子)。我有获取 JSON 并按顺序解析它的脚本 (How I can parse json with arrays by custom order?)。它适用于一个 JSON。我的问题是我需要同时解析几个 JSON(如脚本 3 JSON)以获得正确的 md5 顺序。

我尝试连接 JSON 文件以获取一个用于解析的 JSON,但它没有连接。脚本:

var jsonForparse =[]
  for (page=1;page<3;page++) {

url = "https://some.url/to/json"+page+".json";
xhr.open('GET', url, false);
xhr.send();
json=xhr.responseText ;
//Parse json string
json=JSON.parse(json);
//Connect jsons to jsonForparse
     js =json.concat(js)

  }
//Parse jsonForparse
md5= ids.map(id => jsonForparse.posts.find(post => post.id === id))

我应该如何解析 json 或连接 json 以解析它们以获得 md5 的正确顺序 例子: 应该得到:

md5=[12,34,56,78,90,100]

订单:

ids=[2227726,2277,2218681,22881,6659,2236659]

Json1:


{
   "posts":[
      {
         "id":2236659,

         "file":{

            "size":1325351,
            "md5":"100"
         }
      },
      {
         "id":2227726,

         "file":{

            "size":1182791,
            "md5":"12"
         }
      },
      {
         "id":2218681,

         "file":{
"size":1241188,
"md5":"56"
         }
      }
   ]
}

Json2:

{
   "posts":[
      {
         "id":6659,

         "file":{

            "size":1325351,
            "md5":"90"
         }
      },
      {
         "id":2277,

         "file":{

            "size":1182791,
            "md5":"34"
         }
      },
      {
         "id":22881,

         "file":{
"size":1241188,
"md5":"78"
         }
      }
   ]
}

【问题讨论】:

    标签: javascript json userscripts


    【解决方案1】:

    您需要像现在一样将每个 JSON 解析为对象,而不是加入它们,然后您必须对它们进行排序:

    const obj1 = JSON.parse(json1)
    const obj2 = JSON.parse(json2)
    ... \\ this could be a loop if you have more
    const obj = [...obj1.posts, ...obj2.posts].sort((a,b) => a.file.md5 - b.file.md5)
    const ids = obj.map(e => e.id)
    const md5s = obj.map(e => e.file.md5)
    

    【讨论】:

    • 我使用obj=[...obj1.posts, ...obj2.posts] 进行了一些改进。我将它与它连接起来,然后用md5= ids.map(id =&gt; obj.find(post =&gt; post.id === id)) 正常解析
    • @Tofi 如果我知道您想按 ID 排序并提供整个对象,那么可能比更简单的解决方案(如果 ID 是数字)是:''' obj = [...obj1.posts , ...obj2.posts].sort((a,b) => a.file.id- b.file.id) '''
    【解决方案2】:

    拥抱 JS 的异步特性:p,在第一行异步执行 http 调用。然后用 Promise.all 等待它们准备好,最后合并排序。

    const p = [1, 2, 3].map(idx => fetch(`https://some.url/to/json${idx}.json`).then(res => res.json()));
    
    Promise.all(p).then(results => {
        let posts = results.reduce((acc, val) => acc = [...acc, ...val.posts], [])
        let sorted = ids.map(id => posts.find(post => post.id === id))
        // do smthg here
    });
    

    【讨论】:

    • 我需要通过 id 列表订购。就像在 myscript 的末尾一样。
    • so in sort change .sort((a, b) =&gt; a.file.md5 - b.file.md5) by this .sort((a, b) =&gt; a.id - b.id) 编辑了我的回复
    • 我其实不清楚你想要什么似乎你是通过 md5 订购的,但你说的恰恰相反,顺便说一句,你可以通过提供的代码获得。
    • 请看最后一行脚本。有脚本命令 json md5 通过列表。如果ids=[2236659,2227726,2277,2218681,22881,6659]md5=[100,12,34,56,78,90]。例子中需要Order,脚本读取id的顺序,然后改变whoal json的排序。
    • 如果那不可能,那么我如何像另一个答案一样解析每个 json。当我解析每个 json 时,它给了我 thislist1=[,,,5364,46545,7646];list2=[2846,56645,864854,,,] 我如何连接列表并替换它们,例如list=[2846,56645,864854,5364,46545,7646]
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多