Listar recursivamente todas las rutas de propiedad de objeto desde JSON

Tengo que luchar con los retornos JSON (que obtengo de una respuesta XML de la API de Amazon Marketplace). Contiene matrices, subarrays y así sucesivamente. En este momento necesito obtener solo 2 valores (objeto AmazonOrderId y OrderItem), pero no encuentro la forma de abordarlos directamente. Todavía lo bash por horas. Las cosas recursivas me asustan un poco.

Hay tantas herramientas por ahí, también para beatificar o editar JSON. Entonces, ¿es posible también una solución que muestre todos los enlaces de propiedades recursivamente? Hasta ahora no he encontrado algo como esto.

ACTUALIZACIÓN : Con el código de la respuesta de Squint, construí una herramienta rápida y sucia que hace lo que quería. Aquí está: http://output.jsbin.com/gunixo

me gusta:

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

Esto realmente ahorraría tiempo, en tal caso.

  { "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"] }] } } 

Si realmente solo necesitas esos dos valores, puedes hacerlo mientras se analiza.

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

Dicho esto … las cosas recursivas no deberían dar miedo. Y hay muchas funciones preescritas en StackOverflow que aceptan la propiedad que busca y devuelven el valor, por lo que podría usar una de esas.


Aquí hay una función recursiva simple que genera rutas a todos los datos.

 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); } } } 

Todos los miembros de Array se enumeran individualmente. Esto podría consolidarse si sabe que las estructuras de datos en esos miembros de la matriz son siempre idénticas.

Resultado para sus datos:

 .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] 
    Intereting Posts