Получение и присоединение JSON объектов из нескольких вызовов API - PullRequest
0 голосов
/ 09 мая 2020

Извините, если мой английский sh плохой, и напишите комментарий, если вы не поняли (я отредактирую сообщение). У меня есть сценарий, который получает JSON и анализирует его по порядку ( Как я могу анализировать json с массивами по индивидуальному заказу? ). Хорошо работает на одном 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"
         }
      }
   ]
}

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Примите асинхронный характер 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
});
1 голос
/ 09 мая 2020

Вам нужно разобрать каждый 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)
...