Parsing multi-level JSON [duplicate]

2020-06-06 02:30发布

How to parse multilevel json ?

Json format (n-level deep) :

    [
      {
        "attr" : {
        "id" : "97987"
      },
      "children" : [
            {
              "attr" : {
              "id" : "97988"
            },
            "children" : [
                  {
                    "attr" : {
                    "id" : "97992"
                  },
                  "data" : "tag5"
              }],
            "data" : "tag2"
        },
        {
          "attr" : {
              "id" : "97993"
          },
          "data" : "tag6"
        }
      ],
    "data" : "tag1"
  },
  {
    "attr" : {
        "id" : "97989",
    },
    "children" : [
          {
            "attr" : {
              "id" : "97990"
            },
            "data" : "tag4"
          }],
    "data" : "tag3"
  }
]

for eg. I want to read every children "id".
I have tried $.each but that allows me to parse fixed number of levels.

2条回答
走好不送
2楼-- · 2020-06-06 03:06

You need to use recursion.

function get_all_ids(data) {
    var result = [];

    $(data).each(function (i, element) {
        result.push(element.attr.id);

        if (element.children && element.children.length > 0) {
            var ids = get_all_ids(element.children);

            result = result.concat(ids); // or $.merge(result, ids);
        }
    });

    return result;
}
查看更多
戒情不戒烟
3楼-- · 2020-06-06 03:24

Using $.each() and check object or array for each object.

  1. if object index is "id", push id object into result array
  2. if object is array or object, call recursively.
  3. if not, just return.

Here's some code. Working code is at http://jsfiddle.net/cwdoh/KKFCZ/

function getAll( input, target ) {
    var result = [];

    function parseData( input, target ) {
        $.each( input, function ( index, obj ) {
            if ( index == target ) {
                result.push( obj );
            }
            else {
                switch ( $.type( obj ).toLowerCase() ) {
                case "object":
                case "array":
                    parseData( obj, target );
                    break;
                }
            }
        } );
    }

    parseData( data, "id" );

    return result;
}
查看更多
登录 后发表回答