从JSON

时间:2015-05-17 12:21:21

标签: javascript json node.js object amazon-mws

我必须使用JSON返回(我从Amazon Marketplace API获取XML响应)。它包含数组,子数组等。目前我只需要获得2个值(AmazonOrderId和OrderItem对象),但我找不到直接解决它们的方法。我还是试了几个小时。递归的东西吓到我了。

那里有很多工具,也用于美化或编辑JSON。那么是否还有一个解决方案可以递归地显示所有属性链接?到目前为止,我还没有找到这样的东西。

更新:使用斜视代码的答案,我已经构建了一个快速而肮脏的工具,可以完成我想要的工作。这是:http://output.jsbin.com/gunixo

像:

myJSON.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].QuantityOrdered
myJSON.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].Title
...

在这种情况下,这确实可以节省时间。

    {
    "ListOrderItemsResponse": {
        "$": {
            "xmlns": "https://mws.amazonservices.com/Orders/2013-09-01"
        },
        "ListOrderItemsResult": [{
            "OrderItems": [{
                "OrderItem": [{
                    "QuantityOrdered": ["1"],
                    "Title": ["My Product Title"],
                    "ShippingTax": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["0.00"]
                    }],
                    "PromotionDiscount": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["0.00"]
                    }],
                    "ConditionId": ["New"],
                    "ASIN": ["BXXXI5W6M8"],
                    "SellerSKU": ["KNDR-BTTWSCH-BGSBNNY"],
                    "OrderItemId": ["67050234000659"],
                    "GiftWrapTax": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["0.00"]
                    }],
                    "QuantityShipped": ["1"],
                    "ShippingPrice": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["4.90"]
                    }],
                    "GiftWrapPrice": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["0.00"]
                    }],
                    "ConditionSubtypeId": ["New"],
                    "ItemPrice": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["15.77"]
                    }],
                    "ItemTax": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["0.00"]
                    }],
                    "ShippingDiscount": [{
                        "CurrencyCode": ["EUR"],
                        "Amount": ["0.00"]
                    }]
                }]
            }],
            "AmazonOrderId": ["304-6107803-0000000"]
        }],
        "ResponseMetadata": [{
            "RequestId": ["dd64dd40-d939-4ea1-875d-xxxxxxxxxxxx"]
        }]
    }
}

1 个答案:

答案 0 :(得分:3)

如果您真的只需要这两个值,则可以在解析时执行此操作。

var data = {};

// ----------v--- Original JSON data before parsing.
JSON.parse(myJSON, function(k, v) {
    if (k === "AmazonOrderId" || k === "OrderItem") {
        data[k] = v;
    }
    return v;
});

那说......递归的东西不应该是可怕的。并且StackOverflow上有许多预先编写的函数接受您正在寻找的属性并返回值,因此您可以使用其中一个。

这是一个简单的递归函数,可以生成所有数据的路径。

function objectToPaths(data) {
  var validId = /^[a-z_$][a-z0-9_$]*$/i;
  var result = [];
  doIt(data, "");
  return result;

  function doIt(data, s) {
    if (data && typeof data === "object") {
      if (Array.isArray(data)) {
        for (var i = 0; i < data.length; i++) {
          doIt(data[i], s + "[" + i + "]");
        }
      } else {
        for (var p in data) {
          if (validId.test(p)) {
            doIt(data[p], s + "." + p);
          } else {
            doIt(data[p], s + "[\"" + p + "\"]");
          }
        }
      }
    } else {
      result.push(s);
    }
  }
}

单独列出所有阵列成员。如果您知道这些数组成员中的数据结构始终相同,则可以合并。

您的数据结果:

.ListOrderItemsResponse.$.xmlns
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].QuantityOrdered[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].Title[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ShippingTax[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ShippingTax[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].PromotionDiscount[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].PromotionDiscount[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ConditionId[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ASIN[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].SellerSKU[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].OrderItemId[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].GiftWrapTax[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].GiftWrapTax[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].QuantityShipped[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ShippingPrice[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ShippingPrice[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].GiftWrapPrice[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].GiftWrapPrice[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ConditionSubtypeId[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ItemPrice[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ItemPrice[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ItemTax[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ItemTax[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ShippingDiscount[0].CurrencyCode[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].OrderItems[0].OrderItem[0].ShippingDiscount[0].Amount[0]
.ListOrderItemsResponse.ListOrderItemsResult[0].AmazonOrderId[0]
.ListOrderItemsResponse.ResponseMetadata[0].RequestId[0]