Parsing multi-level JSON [duplicate]

2020-06-06 03:08发布

问题:

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.

回答1:

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


回答2:

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