2015-05-17 55 views
0

我必須與JSON返回(我從亞馬遜市場API中獲取XML響應)戰鬥。它包含數組,子數組等等。目前我只需要獲取2個值(AmazonOrderId和OrderItem對象),但我找不到直接解決它們的方法。我仍然嘗試幾個小時。遞歸的東西嚇了我一下。遞歸列出來自JSON的所有對象屬性路徑

有那麼多的工具,也用於美化或編輯JSON。那麼是否也有可能遞歸顯示所有屬性鏈接的解決方案?到目前爲止,我還沒有找到像這樣的東西。

UPDATE:從斜視的答案代碼我已經建立一個快速和骯髒的工具,做我想做的。那就是: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"] 
     }] 
    } 
} 
+0

如果它是一個XML響應,你爲什麼將其轉換爲JSON?爲什麼不尋找一個工具來遍歷原始的XML呢? XML和JSON的數據類型和結構實際上並沒有很好地映射,所以通過轉換,你只是讓底層結構變得更加困難。 – IMSoP

+0

另外,我不確定你在掙扎着什麼;您給出的兩個示例行看起來像他們可以很好地處理您提供的示例數據。實際上沒有任何遞歸需要,只需要對結構進行深度嵌套訪問。 – IMSoP

+0

感謝您的評論。我使用MWS-JS-2014連接和檢索亞馬遜的數據。這爲我提供了(僅)一個JSON對象。 – Lutz

回答

2

如果您確實只需要這兩個值,您可以在解析它時進行操作。

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] 
+0

感謝您的答案,但這會引發線'JSON.parse(myJSON,函數(k,v){' :SyntaxError:意外的令牌o – Lutz

+0

btw:您標記我的問題爲重複的錯誤。幫助,但這不是我的問題的答案,我知道在stackoverflow上有許多預先寫好的函數,我經常利用這些函數作爲快速解決方案。我敢肯定,有時我沒有正確的關鍵字來尋找我尋找的解決方案。無論如何,我的問題不是代碼片段。我要求提供一個網站/ web服務,其中列出了給定JSON的屬性鏈接或路徑。我搜索了更多,但不幸的是我還沒有找到這個。但是我發現了一個類似的請求:github.com/josdejong/jsoneditor/issues/168 – Lutz

+0

@Lutz:你得到一個錯誤,因爲你沒有傳遞JSON。請參閱上面的代碼註釋。 –