将JSON解析为HTML嵌套列表

时间:2015-06-30 00:56:42

标签: javascript jquery json

JSON:

{
  "Item 1": [
    9,
    {
      "Item 1.1" : 19,
      "Item 1.2" : 29,
      "Item 1.3" : 39
    }
  ],
  "Item 2": 49,
  "Item 3": [
    59,
    {
      "Item 3.1" : 69,
      "Item 3.2" : 79,
      "Item 3.3" : 89
    }
  ]
}

所需的HTML:

<ul class="list">
    <li class="item">
        <a data-page="9">Item 1</a>
        <ul>
            <li><a data-page="19">Item 1.1</a></li>
            <li><a data-page="29">Item 1.2</a></li>
            <li><a data-page="39">Item 1.3</a></li>
        </ul>
    </li>
    <li class="item"><a data-page="49">Item 2</a></li>
    <li class="item">
        <a data-page="59">Item 3</a>
        <ul>
            <li><a data-page="69">Item 3.1</a></li>
            <li><a data-page="79">Item 3.2</a></li>
            <li><a data-page="89">Item 3.3</a></li>
        </ul>
    </li>
</ul>

我的尝试(http://jsbin.com/duxoyitifa/edit?js,console,output):

$(document).ready(function() {

  var json = '{"Item 1":[9,{"Item 1.1":19,"Item 1.2":29,"Item 1.3":39}],"Item 2":49,"Item 3":[59,{"Item 3.1":69,"Item 3.2":79,"Item 3.3":89}]}';

  var obj = $.parseJSON( json );
  //console.log(obj);  
  var items = [];

  $.each( obj, function( k1, v1 ) {
    console.log("k1: " + k1);
    console.log(v1);
    items.push('<li class="item">');

    $.each( v1, function( k2, v2 ) {
      console.log(v2);
      items.push('<a data-page="'+v2+'">'+k1+'</a>');

      $.each (v2, function( k3, v3 ) {
        console.log(v3);
      });

    });
    items.push('</li>');
    //items.push('<li class="item">');
    //items.push('<a data-page="'+n+'">'+key+'</a>');
    //items.push('</li>');

    $("body").append(items.join( "" ));

  });

});

我无法弄清楚如何从嵌套对象中获取n和子列表。

2 个答案:

答案 0 :(得分:3)

$(document).ready(function() {

  var json = '{"Item 1":[9,{"Item 1.1":19,"Item 1.2":29,"Item 1.3":39}],"Item 2":49,"Item 3":[59,{"Item 3.1":69,"Item 3.2":79,"Item 3.3":89}]}';

  var obj = $.parseJSON(json);
  //console.log(obj);  
  var items = [];

  function eachObj(obj) {
    $.each(obj, function(key, value) {
      console.log("iteration start");
      console.log(key, value);
      console.log("iteration end");

      items.push('<li class="item">');
      if (value != null && Array.isArray(value)) {
        items.push('<a data-page="' + value[0] + '">' + key + '</a>');
        items.push('<ul>');
        eachObj(value[1]);
        items.push('</ul>');
      } else {
        items.push('<a data-page="' + value + '">' + key + '</a>');
      }
      items.push('</li>');
    });
  }

  eachObj(obj);

  $('ul.list').html(items.join(""));

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="list">
</ul>

答案 1 :(得分:0)

将需要递归函数。

(当我找出一个确切的解决方案时,有些伪代码)

function parseForm(json){
  var string = "";
  function parseElement(j){
    if(j.constructor === Object){
      //write element to "string"
      for(var i=0; i<j.length; i++){
        parseForm(j[i]);
      }
      //write end tag
    }else if(j.constructor === Array){
      //write element
      for(var i in j){
        parseForm(j[i]);
      }
      //write end tag
    }else{
      //write
    }
  }

  parseForm(json);

  return string;
}

这无限深入。此解决方案的关键是将递归部分夹在开始/结束标记之间。我不确切知道格式化的规则是什么;我会让你弄清楚具体的细节。