2015-05-05 10 views
5

Ich habe Probleme mit einem unangenehmen JSON-Objekt, das ich in ein JS-Objekt mit variabler Tiefe konvertieren muss.Dynamisch JavaScript-Objekte mit variabler Tiefe erstellen

Kurz: (Ich bin mit 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}. 

Jetzt muss ich mit variabler Tiefe, dass nastyJSON zu einem JS-Objekt konvertieren. Ich meine:

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

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

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

Meine besten ist es manuell zu erstellen, Looping nastyJSON, Schaltergehäuse Tasten und Objekte zu schaffen Werte am Ende der bekannten Tiefe hinzufügen.

So:

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

Aber was, wenn ich nicht weiß, zunächst die nastyJSON Struktur, und ich weiß nur, dass nastyJSON Schlüssel habe ich bis zum Ende des Split und Nest musste?

Vielen Dank im Voraus.

+0

Ich kann nicht die Art der Zeichenfolge ändern, die analysiert werden muss (der nastyJSON_string). Ich muss mit Schlüsseln mit "_" in ihnen arbeiten, um eine Niveauänderung im abschließenden js Gegenstand anzuzeigen. – Nineoclick

Antwort

3

Sie nicht jQuery benötigen, Vanille JS tun (here ist eine Geige):

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

Ausgang:

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