Генерация JSON из вложенных множеств (perl, sql, jquery) - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть страницы контента в базе данных (с использованием вложенных наборов), и мне нужно показать это с помощью плагина jQuery jsTree.Необходимо вернуть JSON с такими данными:

[
    {
        data: 'node1Title',
        children: [
            {
                data: 'subNode1Title',
                children: [...]
            },
            {
                data: 'subNode2Title',
                children: [...]
            }
        ]
    },
    {
        data: 'node2Title',
        children: [...]
    }
]

Что мне нужно для этого?

Я могу преобразовать массив хэшей в JSON, но я не понимаю, как сгенерироватьмассив.

Пример данных:

**'pages'table**
id  parent_id   level   lkey    rkey    name
1   0       1   1   14  index
2   1       2   2   7   info
3   1       2   8   13  test
4   2       3   3   4   about
5   2       3   5   6   help
6   3       3   9   10  test1
7   3       3   11  12  test2

Мне нужно получить:

[
    {
        data: 'index',
        children: [
            {
                data: 'info',
                children: [
                    {
                        data: 'about'
                    },
                    {
                        data: 'help',
                    }
                ]
            },
            {
                data: 'test',
                children: [
                    {
                        data: 'test1'
                    },
                    {
                        data: 'test2'
                    }
                ]
            }
        ]
    }
]

Ответы [ 4 ]

2 голосов
/ 12 мая 2011

У меня была точно такая же проблема, и вот что я написал в Perl для преобразования моего дерева вложенных множеств в объект JSON для плагина jsTree (я использую DBIx :: Tree :: NestedSet для доступа к дереву базы данных MySQL).Я знаю, что мой код ужасен с точки зрения Perl, но он работает для меня.

sub get_json_tree {
    my $json = '[';
    my $first = 1;
    my $last_level = 1;
    my $level = 1;
    my $tree = DBIx::Tree::NestedSet->new(dbh => $dbh);
    my $ancestors = $tree->get_self_and_children_flat(id => $tree->get_root);
    foreach (@{$ancestors}) {
        my $name = $_->{'name'};
        $last_level = $level;
        $level = $_->{'level'};
        if ($level > $last_level) {
            $json .= ',' if ($json =~ /}$/);
        } elsif ($level < $last_level) {
            $json .= ']}';
            for (my $i = 0; $i < $last_level - $level; $i++) {
                $json .= ']}';
            }
            $json .= ',';
        } elsif ($level == $last_level && !$first) {
            $json .= ']},';
        }
        $json .= '{"attr":{"id":'.$_->{'id'}.',"rel":"folder"},"data":"'.$name.'","children":[';
        $first = 0;
    }
    $json .= ']}';
    for (my $i = 1; $i < $level; $i++) {
        $json .= ']}';
    }    
    $json .= ']';
    return $json;
}
1 голос
/ 10 июля 2015

Это очень просто. Вам нужно написать рекурсивную функцию. Я написал это на Perl. $ list - это ваш массив, отсортированный по 'left_key'.

sub make_tree {
    my $list = shift;
    my @nodes;

    while (my $node = shift @$list) {
        if (@$list and $node->{level} < $list->[0]{level}) {
            $node->{data} = make_tree($list);
            push @nodes, $node;
        }
        last if @$list and $node->{level} > $list->[0]{level};
    }

    return \@nodes;
}

my $hash = make_tree($list);
1 голос
/ 20 июня 2014

Я ищу это.Возможно, примеры плагинов DataTable предлагают решение.Я смотрю на каталог плагинов /examples/server_side/scripts/ssp.class.php.Вы можете скачать его здесь .

Узнайте о простейшем способе его использования на ярлыке "Серверный скрипт" в этой документации .

0 голосов
/ 18 августа 2015

Недавно я искал подобное решение.Я не нашел это, пока не отправил свой собственный вопрос.Окончательный код, который я разместил на вопрос, я думаю, хорошо бы ответил на ваш вопрос.

Я использую следующий код с измененной версией DBIx :: Tree :: NestedSet .Я использую этот код для создания JSON-вывода дерева вложенных множеств.

Преобразование плоской структуры данных в дерево

sub get_jsonTree {
    my ($array_of_hashes_ref) = @_;

    my $roots;
    my %recs_by_name;
    my %children_by_parent_name;
    my %count;
    for my $row (@$array_of_hashes_ref) {
        my $name        = $row->{position_id};
        my $parent_name = $row->{placement_id};

        my $rec = {
            name => $name,
        };

        ## Added to loop through all key,value pairs and add them to $rec
        while ( my ($key, $value) = each(%$row) ) {
            $rec->{$key} = $value;
        }

        ##Added To Count Child Nodes
        $count{$parent_name} = 0 if (!$count{$parent_name});        
        $rec->{'child_count'} = $count{$parent_name};
        $count{$parent_name}++;

        push @{ $children_by_parent_name{$parent_name // 'root'} }, $rec;
        $recs_by_name{$name} = $rec;
    }

    $roots = delete($children_by_parent_name{root}) || [];

    for my $name (keys(%children_by_parent_name)) {
        my $children = $children_by_parent_name{$name};
        if ( my $rec = $recs_by_name{$name} ) {
            $rec->{children} = $children;
        } else {
            $util{'test'} .=  "Parent $name doesn't exist.\n<BR>";
            push @$roots, @$children;
        }
    }

    use JSON;
    my $json_str = encode_json(@{$roots}[0]);

    return $json_str;
}

my $array_of_hashes_ref = [
    {  position_id => 123, placement_id => undef },
    {  position_id => 456, placement_id => 123 },
    {  position_id => 789, placement_id => 123 },
    # ...
];

my $json_str = &get_jsonTree($array_of_hashes_ref);
...