如何从深层li结构创建json输出

时间:2016-12-25 09:53:49

标签: javascript jquery html json

我有ol li结构作为html,我想从中创建JSON,但我的代码不会创建我需要的JSON。任何人都可以帮我解决一下吗?

我需要像那样创建JSON

[
        {"en":"Menu1","enlink":"#enlink1","tr":"Menü 1","trlink":"#trlink1","data":[
            {"en":"Menu1-1","enlink":"#enlink1-1","tr":"Menü 1-1","trlink":"#trlink1-1","data":[
                {"en":"Menu1-1-1","enlink":"#enlink1-1-1","tr":"Menü 1-1-1","trlink":"#trlink1-1-1"},
                {"en":"Menu1-1-2","enlink":"#enlink1-1-2","tr":"Menü 1-1-2","trlink":"#trlink1-1-2"}
            ]},
        ]},
        {"en":"Menu2","enlink":"#enlink2","tr":"Menü 2","trlink":"#trlink2","data":[
            {"en":"Menu2-1","enlink":"#enlink2-1","tr":"Menü 2-1","trlink":"#trlink2-1"},
            {"en":"Menu2-1","enlink":"#enlink2-1","tr":"Menü 2-1","trlink":"#trlink2-1"}
        ]},
        {"en":"Menu3","enlink":"#enlink3","tr":"Menü 3","trlink":"#trlink3"}
        ]

我的示例代码是..

var buildJson = function (root){
	if(!root){
		root='#domenu-en';
	}
	var result = [];
	$(' ol > li ',root).each(function() {
		if($(this).children("ol").length){
			result.push({"en":$(this).attr("data-en"),"data":buildJson($(this))});
			//return false;
		} else{
			result.push({"en":$(this).attr("data-en")});
		}
	});
 return result;
}
$('#results').val(JSON.stringify(buildJson()))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="domenu-en">
<ol>
	<li data-enlink="#enlink1" data-en="Menu1" data-trlink="#trlink1" data-tr="Menü 1">
		<ol>
			<li data-enlink="#enlink1-1" data-en="Menu1-1" data-trlink="#trlink1-1" data-tr="Menü 1-1">
				<ol>
					<li data-enlink="#enlink1-1-1" data-en="Menu1-1-1" data-trlink="#trlink1-1-1" data-tr="Menü 1-1-1">
					</li>
					<li data-enlink="#enlink1-1-2" data-en="Menu1-1-2" data-trlink="#trlink1-1-2" data-tr="Menü 1-1-2">
					</li>
				</ol>
			</li>
		</ol>
	</li>
	<li data-enlink="#enlink2" data-en="Menu2" data-trlink="#trlink2" data-tr="Menü 2">
		<ol>
			<li data-enlink="#enlink2-1" data-en="Menu2-1" data-trlink="#trlink2-1" data-tr="Menü 2-1">
			</li>
			<li data-enlink="#enlink2-1" data-en="Menu2-1" data-trlink="#trlink2-1" data-tr="Menü 2-1">
			</li>
		</ol>
	</li>
	<li data-enlink="#enlink3" data-en="Menu3" data-trlink="#trlink3" data-tr="Menü 3">
	</li>
</ol>
</div>
<textarea id="results" style=" height: 279px;"></textarea>

2 个答案:

答案 0 :(得分:1)

我发现解决方案很简单,万一我需要分享它。如果我们告诉jQuery选择第一个li为 ol:first&gt; li ,那么它会生成与li结构相同的层次结构。

var buildJson = function (root){
if(!root){
    root='#domenu-en';
}
var result = [];
$('ol:first > li ',root).each(function() {
var itemdata = {};
$.each($(this).data(), function(key, value) {
  itemdata[key] = value;
});

    if($(this).children("ol").length){

  itemdata["data"] = buildJson($(this));
    }

result.push(itemdata);
});
 return result;
}

答案 1 :(得分:0)

主要区别似乎是您不包含data-以外的其他data-en属性。您可以使用data-迭代元素上的所有$.each($(this).data(), function(key, value) {})属性。

在你的情况下会是这样的:

$(' ol > li ',root).each(function() {
    var itemdata = {};
    $.each($(this).data(), function(key, value) {
        itemdata[key] = value;
    });

    if($(this).children("ol").length){
        itemdata["data"] = buildJson($(this));
    }

    result.push(itemdata);
});

这应该给你一个相等的JSON结果。这些属性可能有不同的顺序,但这对JSON来说并不重要(例如:您的JSON示例具有en,enlink,tr和trlink顺序,而我的示例中有tr,trlink,en和enlink) 。列表中菜单项的顺序仍然相同(1,1-1,1-2等)。

https://jsfiddle.net/gpctm9d1/

的工作示例