2015-05-05 10 views
5

Mam kłopot z nieprzyjemnym obiektem JSON, który muszę przekonwertować na obiekt JS ze zmienną głębią.Dynamicznie twórz obiekty JavaScript o zmiennej głębokości

Krótko: (używam jQuery)

var nastyJSON_string = "{"generics_utenteID":"1","generics_elencoID":"1","mainbar_ade_stepID_0":"1","mainbar_ade_stepID_1":"3","mainbar_ade_stepTitle_0":"blablabla", "mainbar_ade_stepTitle_1" : "quiquoqua"}"; 

var nastyJSON = JSON.parse(nastyJSON_string); 

// nastyJSON if parsed correctly now is: {generics_utenteID:"1",generics_elencoID:"1" ...and so on}. 

Teraz muszę konwertować że nastyJSON do obiektu JS o zmiennej głębokości. To znaczy:

var reusableJSObject = { 
    generics : { 
     utenteID : 1, 
     elencoID : 1 
    }, 

    mainbar : { 
     ade : { 
      stepID : { 
       0 : 1, 
       1 : 3 
      }, 

      stepTitle : { 
       0 : "blablabla", 
       1 : "quiquoqua" 
      } 
     } 
    } 
} 

Moja najlepsza jest, aby go utworzyć ręcznie, zapętlenie klucze nastyJSON, switch-obudowy oraz tworzenia obiektów dodawanie wartości na koniec znanej głębokości.

Jak to:

jQuery.each(nastyJSON, function(key,value){ 
    var keysp = key.split('_'); 
    switch(keysp[0]) 
    { 
     //# generics 
     case 'generics': 

      if(!reusableJSObject.hasOwnProperty(keysp[0])) { reusableJSObject[keysp[0]] = new Object(); }; 

      switch(keysp[1]) 
      { 
       //# utenteID 
       case 'utenteID': 
        if(!reusableJSObject[keysp[0]].hasOwnProperty(keysp[1])) { reusableJSObject[keysp[0]][keysp[1]]; }; 
        reusableJSObject[keysp[0]][keysp[1]] = Number(value); 
       break; 

       //# elencoID 
       case 'elencoID': 
        if(!reusableJSObject[keysp[0]].hasOwnProperty(keysp[1])) { reusableJSObject[keysp[0]][keysp[1]]; }; 
        reusableJSObject[keysp[0]][keysp[1]] = Number(value); 
       break; 
      } 
     break; 


     //# mainbar 
     case 'mainbar': 
      if(!reusableJSObject.hasOwnProperty(keysp[0])) { reusableJSObject[keysp[0]] = new Object(); }; 
     break; 

     //... and So On! 
    } 
}); 

Ale co, jeśli nie wiem, na pierwszej strukturze nastyJSON, a ja tylko wiem, że nastyJSON ma klucze musiałem podzielić i gniazdo do końca rozłamu?

Z góry dziękuję.

+0

nie mogę zmienić rodzaj łańcucha, który ma być analizowany (nieprzyjemny JSON_string). Muszę pracować z kluczami z "_" w nich, aby wskazać zmianę poziomu w końcowym obiekcie js. – Nineoclick

Odpowiedz

3

Nie trzeba jQuery, wanilia JS zrobi (here jest skrzypce):

var json = '{"generics_utenteID":"1","generics_elencoID":"1","mainbar_ade_stepID_0":"1","mainbar_ade_stepID_1":"3","mainbar_ade_stepTitle_0":"blablabla", "mainbar_ade_stepTitle_1" : "quiquoqua"}'; 
var obj = JSON.parse(json); 

function parse(object) { 
    var result = {}; 
    var temp = {}; 
    var keys; 

    for (var property in object) { 
     keys = property.split('_'); 
     temp = result; 

     for (var i = 0; i < keys.length - 1; i++) { 
      if (typeof temp[keys[i]] == 'undefined') { 
       temp[keys[i]] = {}; 
      } 
      temp = temp[keys[i]]; 
     }; 

     temp[keys[i]] = object[property]; 
    } 

    return result; 

} 

console.log(JSON.stringify(parse(obj))); 

wyjściowa:

{ 
    "generics":{ 
     "utenteID":"1", 
     "elencoID":"1" 
    }, 
    "mainbar":{ 
     "ade":{ 
     "stepID":{ 
      "0":"1", 
      "1":"3" 
     }, 
     "stepTitle":{ 
      "0":"blablabla", 
      "1":"quiquoqua" 
     } 
     } 
    } 
} 
Powiązane problemy