2011-02-03 54 views
2

我有數據庫中的內容頁面(使用嵌套集),我需要通過jQuery jsTree插件顯示它。它需要像這樣的數據返回JSON:從嵌套集(perl,sql,jquery)生成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' 
        } 
       ] 
      } 
     ] 
    } 
] 
+0

請澄清你的問題。你需要從Perl生成JSON嗎?您可以發佈您擁有的數據樣本以及您已經提供的輸出嗎? – 2011-02-03 09:33:00

回答

2

我有完全一樣的問題,這裏是我在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

我正在找它。也許DataTable插件的例子提供了一個解決方案。我正在查看插件目錄/examples/server_side/scripts/ssp.class.php。你可以download it here

看看在this documentation的「服務器端腳本」標籤中使用它的最簡單方法。

1

這很簡單。你需要編寫一個遞歸函數。我用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); 
0

最近我在尋找一個類似的解決方案。直到發佈我自己的問題之後,我才發現這一點。我發佈的最終代碼我認爲會很好地回答你的問題。

我使用以下代碼,修改後的版本爲DBIx::Tree::NestedSet。我使用此代碼創建嵌套集樹的JSON輸出。

Convert a flat datastructure into a tree

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