递归列出来自 JSON 的所有对象 属性 路径
Recursively list all object property paths from JSON
我不得不与 JSON returns 作斗争(这是我从 Amazon Marketplace API 的 XML 响应中得到的)。它包含数组、子数组等。目前我只需要获取 2 个值(AmazonOrderId 和 OrderItem 对象),但我找不到直接解决它们的方法。我仍然尝试了几个小时。递归的东西让我有点害怕。
有很多工具,也可以用于美化或编辑 JSON。那么是否还有一个解决方案可以递归显示所有 属性 链接?到目前为止我还没有找到这样的东西。
UPDATE:使用 squint 的回答中的代码,我构建了一个快速而肮脏的工具,它可以满足我的需求。这是: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"]
}]
}
}
如果你真的只需要这两个值,你可以在解析的时候进行。
var data = {};
// ----------v--- Original JSON data before parsing.
JSON.parse(myJSON, function(k, v) {
if (k === "AmazonOrderId" || k === "OrderItem") {
data[k] = v;
}
return v;
});
就是说...递归的东西不应该让人害怕。 Whosebug 上有许多预先编写的函数可以接受您要查找的 属性 和 return 值,因此您可以只使用其中之一。
这是一个生成所有数据路径的简单递归函数。
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]
我不得不与 JSON returns 作斗争(这是我从 Amazon Marketplace API 的 XML 响应中得到的)。它包含数组、子数组等。目前我只需要获取 2 个值(AmazonOrderId 和 OrderItem 对象),但我找不到直接解决它们的方法。我仍然尝试了几个小时。递归的东西让我有点害怕。
有很多工具,也可以用于美化或编辑 JSON。那么是否还有一个解决方案可以递归显示所有 属性 链接?到目前为止我还没有找到这样的东西。
UPDATE:使用 squint 的回答中的代码,我构建了一个快速而肮脏的工具,它可以满足我的需求。这是: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"]
}]
}
}
如果你真的只需要这两个值,你可以在解析的时候进行。
var data = {};
// ----------v--- Original JSON data before parsing.
JSON.parse(myJSON, function(k, v) {
if (k === "AmazonOrderId" || k === "OrderItem") {
data[k] = v;
}
return v;
});
就是说...递归的东西不应该让人害怕。 Whosebug 上有许多预先编写的函数可以接受您要查找的 属性 和 return 值,因此您可以只使用其中之一。
这是一个生成所有数据路径的简单递归函数。
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]