2015-07-28 2 views
0

Я пытаюсь преобразовать JSON, который я получаю из API, в другую форму JSON в Javascript. У моего JSON есть члены, много «родителей» (вложенных объектов) и много детей (вложенные массивы объектов). Я бы хотел сделать своих родителей.«Вложенные» JSON в «unsested» JSON в Javascript

Образец моей JSON выглядит следующим образом:

[ 
    { 
    "street": [ 
     { 
     "addressinfo": { 
      "id": 110, 
      "description": "Bezoekaddress" 
     }, 
     "id": 1, 
     "name": "Hoogveldstraat" 
     } 
    ], 
    "id": 1, 
    "searchName": "JacksIcecream", 
    "chamberOfCommerce": "" 
    }, 
    { 
    "street": [], 
    "id": 2, 
    "searchName": "OAK", 
    "chamberOfCommerce": "" 
    } 
] 

и я пытаюсь преобразовать его в следующем:

[ 
    { 
    "street": [ 
     { 
     "addressinfo_id": 110, 
     "addressinfo_description": "Bezoekaddress", 
     "id": 1, 
     "name": "Hoogveldstraat" 
     } 
    ], 
    "id": 1, 
    "searchName": "JacksIcecream", 
    "chamberOfCommerce": "" 
    }, 
    { 
    "street": [], 
    "id": 2, 
    "searchName": "OAK", 
    "chamberOfCommerce": "" 
    } 
] 

теперь я застрял на это некоторое время, и я действительно не могу найти ответа на этот вопрос, все вопросы, которые я могу найти, касаются сглаживания массивов, в то время как я хочу «сгладить не-массивные-вложенные объекты». Как я могу сделать что-то подобное?

+0

см. Http://stackoverflow.com/help/how-to-ask. Неясно, какой язык программирования вы используете или что вы пробовали. –

+0

@bn. OP использует Javascript. Он говорит как в заголовке, так и в тегах. – Smittey

+0

Не звучать грубо, но могу ли я спросить, почему вы хотите внести изменения? Для меня первая альтернатива выглядит чище. – pingul

ответ

0
function parseObject(obj) { 
    var i, path, x, type = ({}).toString.call(obj); 
    if (type == "[object Array]") { 
     for (i = 0; i < obj.length; i++) { 
      parseObject(obj[i]); 
     } 
    } 
    else if (type == "[object Object]") { 
     path = (arguments[1] && arguments[1].length) ? arguments[1] + "_" : ""; 
     for(i in obj) { 
      if (obj.hasOwnProperty(i)) { 
       x = obj[i]; 
       if (path.length) { 
        delete obj[i]; 
        obj[path + i] = x; 
       } 
       parseObject(x, path + i); 
      } 
     } 
    } 
} 

испытываться следующим образом:

var x = [{ 
    "street": [{ 
     "addressinfo": { 
      "id": 110, 
      "description": "Bezoekaddress" 
     }, 
     "id": 1, 
     "name": "Hoogveldstraat" 
    }], 
    "id": 1, 
    "searchName": "JacksIcecream", 
    "chamberOfCommerce": "" 
}, { 
    "street": [], 
    "id": 2, 
    "searchName": "OAK", 
    "chamberOfCommerce": "" 
}]; 
parseObject(x); 
console.log(JSON.stringify(x)); 

Output (пробежать http://jsbeautifier.org/):

[{ 
    "street": [{ 
     "addressinfo": { 
      "addressinfo_id": 110, 
      "addressinfo_description": "Bezoekaddress" 
     }, 
     "id": 1, 
     "name": "Hoogveldstraat" 
    }], 
    "id": 1, 
    "searchName": "JacksIcecream", 
    "chamberOfCommerce": "" 
}, { 
    "street": [], 
    "id": 2, 
    "searchName": "OAK", 
    "chamberOfCommerce": "" 
}] 
+0

Это отличается от результата запроса OP, который не имеет отдельного хэша 'addressinfo'. –

+0

вы правы, но вам потребовалось 7 недель, чтобы указать на это: D (просто шучу) –

-1

Проверить это

// Convert Nested Json to Flat Json 
 
// Check the final json in firebug console. 
 
var fullData = {"data":[{"Vehicle":"BMW","Date":"30, Jul 2013 09:24 AM","Location":"Hauz Khas, Enclave, New Delhi, Delhi, India","Speed":42,"Children":[{"Vehicle":"BMW","Date":"30, Jul 2013 09:24 AM","Location":"Hauz Khas, Enclave, New Delhi, Delhi, India","Speed":42,"Children":[{"Vehicle":"BMW","Date":"30, Jul 2013 09:24 AM","Location":"Hauz Khas, Enclave, New Delhi, Delhi, India","Speed":42,"Children":[]}]},{"Vehicle":"Honda CBR","Date":"30, Jul 2013 12:00 AM","Location":"Military Road, West Bengal 734013, India","Speed":0,"Children":[]}]},{"Vehicle":"Honda CBR","Date":"30, Jul 2013 12:00 AM","Location":"Military Road, West Bengal 734013, India","Speed":0,"Children":[]},{"Vehicle":"Supra","Date":"30, Jul 2013 07:53 AM","Location":"Sec-45, St. Angel's School, Gurgaon, Haryana, India","Speed":58,"Children":[]},{"Vehicle":"Land Cruiser","Date":"30, Jul 2013 09:35 AM","Location":"DLF Phase I, Marble Market, Gurgaon, Haryana, India","Speed":83,"Children":[]},{"Vehicle":"Suzuki Swift","Date":"30, Jul 2013 12:02 AM","Location":"Behind Central Bank RO, Ram Krishna Rd by-lane, Siliguri, West Bengal, India","Speed":0,"Children":[]},{"Vehicle":"Honda Civic","Date":"30, Jul 2013 12:00 AM","Location":"Behind Central Bank RO, Ram Krishna Rd by-lane, Siliguri, West Bengal, India","Speed":0,"Children":[]},{"Vehicle":"Honda Accord","Date":"30, Jul 2013 11:05 AM","Location":"DLF Phase IV, Super Mart 1, Gurgaon, Haryana, India","Speed":71,"Children":[]}]} 
 
var finalData = []; 
 
loopJson(fullData.data); 
 
function loopJson(data) { 
 
    $.each(data, function(i, e) { 
 
     if (e.Children.length>0) { 
 
      var ccd = e.Children; 
 
      delete e.Children; 
 
      finalData.push(e); 
 
      loopJson(ccd); 
 
     } else { 
 
      delete e.Children; 
 
      finalData.push(e); 
 
     } 
 
    }); 
 
} 
 
console.log(finalData);

Вот скрипка для него: http://jsfiddle.net/2nwm43yc/

0

Loop над элементами массива верхнего уровня, найти street массив в каждом элементе, и петлю над его членами и управлять их содержанием:

json . forEach(function(elt) { 
    elt.street . forEach(function(street) { 
    street.addressinfo_id = street.addressinfo.id; 
    street.addressinfo_desc = street.addressinfo.desc; 
    delete street.addressinfo; 
    }); 
}); 

или вы искали что-то более общее и параметрируемое?

Смежные вопросы