【问题标题】:How do I parse data from a json api that has multiple pages如何从具有多个页面的 json api 解析数据
【发布时间】:2017-06-02 07:59:00
【问题描述】:

目标:从跨多个页面列出结果的 API 解析 JSON。

我对 JSON 和一般数据处理不熟悉。我想知道如何编写一个函数来更新 url,输出每个页面的结果,并在到达一个空页面时停止。

这里的问题来自显示 JSON 数据的 Shopify url,这些数据用于琐碎的目的,而不是实际应用程序的一部分。

https://shopicruit.myshopify.com/admin/orders.json?page=1&access_token=c32313df0d0ef512ca64d5b336a0d7c6

每个页面有 5O 个对象。我正在向 url 发出 $.ajax 请求,但 url 有 page=1 作为查询,

$.ajax({
        url:"https://shopicruit.myshopify.com/admin/orders.json?page=1&access_token=c32313df0d0ef512ca64d5b336a0d7c6",
        method:'get',
        dataType:'JSON'
      }).done(function(response){

所以我回来的response 只是为了第一页的结果(显然)。我知道如果我手动放置 2 代替 1 会有更多页面 b/c 我可以看到不同的数据。这持续了多个页面。我已经尝试删除页面选项,将其设置为 all 和 any,而这些只显示第 1 页。我想也许将 page 选项排除在外可以解决问题,但它没有。

如何通过 ajax 调用获取所有数据页面? 它是一个在其中接受 $.ajaxcall 的函数,它添加了 page++ 并为每个页面进行了新的调用?可悲的是我还是不知道怎么写。

shopify API 文档确实提供了一些关于如何显示“所有数据”的示例,但我尝试使用他们建议的内容但它不起作用,所以我不确定它是否适用于该问题,但以防万一是- https://help.shopify.com/api/reference/order

【问题讨论】:

  • 好吧,您可以将一次获得的订单数量增加到 250 个 limit=250 ... 但您需要有某种循环来获得下一个“一堆”1 页一次,直到我猜你收到orders.length < 250 - 然后不要转到下一页

标签: javascript jquery json ajax


【解决方案1】:

这是一个简单的答案 - 这将获取页面,直到显然没有更多数据 - 即一旦页面返回少于 limit 订单

function getAllData(page) {
    return $.ajax({
        url:"https://shopicruit.myshopify.com/admin/orders.json?page=" + (page || 1) + "&limit=250&access_token=c32313df0d0ef512ca64d5b336a0d7c6",
        method:'get',
        dataType:'JSON'
    }).then(function(response){
        if (page && response.orders.length == 250) {
            return getAllData(page + 1)
            .then(function (more) {
                return response.orders.concat(more)
            })
        }
        return response.orders;
    });
}

getAllData(1).then(function(orders) {
    // orders is an array of orders
});

请注意,我使用 250 表示 limit 一次获得 250 个

我说这很简单,因为它确实获取了所有数据,但是,您需要等到所有数据都被检索到才能使用它 - 这对于您的“用户体验”来说可能需要太长时间 - 但这应该带你到一个可以开始的地方

代码中有这样的逻辑,如果 page 为 0,则无论其中有多少项目,都只会检索第一页 - 所以你可以做类似的事情

getAllData().then(function(page1data) {
    // do something with page 1
}).then(function() {
    return getAllData(2); // start at page 2
}).then(function(restOfData) {
    // do something with restOfData, pages 2+
});

我不确定的一件事是

.then(function(response){

您可能需要将其更改为

.then(function(r){
    var response = r[0];

我不是 100% 确定 jQuery 的 .then 回调参数

【讨论】:

  • 抱歉耽搁了,但我正在尝试处理一些事情。我们现在可以忘记 250 的限制吗?我不担心性能,所以让它保持原样以减少混乱。 (page || 1) 是什么?那是or,还是pipe?我对管道还是很陌生。你正在做的正是我想做的,page++,但我真的不明白你是如何到达那里的。或者这只是一种允许我做我一直想做的事情的语法。我不完全知道如何解释我不理解的内容。
  • 你可以用 50 代替 250
  • 我真的很喜欢你的解决方案!但这有点让我头疼。我无法让它工作,至少不是顶级块。 more 上的断点返回为未定义。我想这就是你说你不确定的。这会破坏concat,进而破坏功能。我不确定为什么会这样。
猜你喜欢
  • 2015-07-10
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多