I am trying to convert a JSON into an unordered list in jQuery.This is my JSON data.
var myJSON = \"{name:\\\"Director\\\",children:[name:\\\"Exe Director1\\\",n
You can use recursive function as follows. Everytime the function is called it returns a "UL", along with its child "LI".
function generateMenu(data) {
var ul = $("<ul>");
$(data).each(function (i, dir) {
var li = $('<li>' + dir.name + '</li>');
ul.append(li);
if (dir.children != null && dir.children.length > 0) {
li.append(generateMenu(dir.children));
}
});
return ul;
};
Use it as :
$("#some-div").append(generateMenu(myJsonData));
The Json is,
var myJsonData = JSON.parse('{"name": "Director","children": [{ "name": "Exe Director1" },{ "name": "Exe Director2" },{"name": "Exe Director3","children": [{ "name": "Sub Director1" },{ "name": "Sub Director2" },{"name": "Sub Director3","children": [{ "name": "Cameraman 1" },{ "name": "Cameraman 2" }]}]}]}');
This is exactly what you need:
Use the jQuery template API. This was once part of jQuery but is currently only available as plugin. However, I think jQuery will adopt this or a similar technique again soon.
http://api.jquery.com/category/plugins/templates/
Its super easy to use:
$.tmpl("template", jsonObject)
Here a small basic template example:
$.tmpl(
"<li><b>${Id}</b>${Name}</li>",
[{Id:1, Name:"Werner"}, {Id:2, Name:"Klaus"}]
);
This will result in the following jQuery HTML element that can be appended to anywhere:
For your complex data, you can also iterate JSON sub objects using the "{{each}}" template notation. Here the code for your data and template:
var data = {name:"Director",children:[{name:"Exe Director1"},{name:"Exe Director2"},{name:"Exe Director3", children:[{name:"Sub Director3_1"},{name:"Sub Director3_2"},{name:"Sub Director3_3",children:[{name:"Cameraman3_3_1"},{name:"Cameraman3_3_2"}]}]}]};
var template = '\
<ul>\
<li>${name}\
<ul>\
{{each(childindex, child) children}}\
<li>${child.name}\
<ul>\
{{each(child2index, child2) child.children}}\
<li>${child2.name}</li>\
{{/each}}\
</ul>\
</li>\
{{/each}}\
</ul>\
</li>\
</ul>\
';
$('body').empty().append($.tmpl(template, data));
Browsers Result:
This can be tweaked to support full recursion by including nested templates... but im a lazy guy and the rest is todo for you.
cheers, will