1

私のperlスクリプトでは、SNMPを介してネットワーク内のCiscoルーターからCDPネイバー情報(この場合はデバイスのIPアドレス)を収集することにより、2次元ハッシュを入力しました。ハッシュにより、重複を制限し、親娘の関係をキャプチャすることができました。

$name{$hostIP}{$neighbourIP} = $name;

ハッシュ化されたデータをD3.js(樹状図)で使用して、ルータートポロジまたは接続関係を示し、次のように再帰的にJSONでフォーマットされたデータが必要です。

{
 name: "10.120.5.1",
 children: [
  {
   name: "10.120.5.2",
   children: [
    {
     name: "10.120.5.3",
     children: [
      {
       name: "10.120.5.4"
      },
      {
       name: "10.120.6.1"
      },
      {
       name: "10.120.6.2"
      },
      {
       name: "10.120.6.3"
      }
     ]
    }
   ]
  }
 ]
}

誰かがライブラリまたは通常の印刷ステートメントを使用して、上記のようなハッシュ形式をJSONに変換する方法を示す例を提供できますか?Perlが推奨されますが、Python、Cなどの任意の言語が役立ちます。また、この仕事をするオープンソーススクリプトを誰かがすでに知っているなら、私は比較したいと思います。

4

2 に答える 2

1

JSONモジュールを使用します。

https://metacpan.org/pod/JSON

JSONを使用します。

私の$json= JSON-> new();

私の$json_string= $ json-> encode($ hash_to_send_to_d3)

于 2012-12-17T18:23:06.693 に答える
1

これは再帰に役立ちますか?あなたと同じようなハッシュから始めて、私は実行します

  • どの子をどの親と一緒にリストできるかを確認するための幅優先探索
  • その後、jsonサンプルと同等のハッシュを構築するために、その中間構造の深さ優先ウォークスルーが続きます
  • その後、jsonへのストレートダンプが続きます。

データを2回歩くのは最適ではないように見えますが、それを行わないと、樹状図が非常に深くなります。

#!/bin/perl

use 5.010; # Enable 'say'. Sorry, old perl
use strict;
use warnings;
use JSON::PP; # Just 'use JSON;' on most systems

# 0. set up some data in adjacency table
my %name;
$name{'10.120.5.1'}{'10.120.5.2'}++;
$name{'10.120.5.2'}{'10.120.5.1'}++;

$name{'10.120.5.2'}{'10.120.5.3'}++;
$name{'10.120.5.3'}{'10.120.5.2'}++;

$name{'10.120.5.3'}{'10.120.5.4'}++;
$name{'10.120.5.4'}{'10.120.5.3'}++;

$name{'10.120.5.3'}{'10.120.6.1'}++;
$name{'10.120.6.1'}{'10.120.5.3'}++;

$name{'10.120.5.3'}{'10.120.6.2'}++;
$name{'10.120.6.2'}{'10.120.5.3'}++;

$name{'10.120.5.3'}{'10.120.6.3'}++;
$name{'10.120.6.3'}{'10.120.5.3'}++;


# 1. set up helper structures
# pick a starting point
(my $root) = keys %name;

# empty structures
my %nodes = ();
my %tree  = ();
my @queue = ($root);

# 2. First pass: BFS to determine child nodes 
list_children(\%name, \@queue, \%nodes) while @queue;

# 3. Second pass: DFS to set up tree
my $tree = build_tree($root, \%nodes);

# 4. And use JSON to dump that data structure
my $json = JSON::PP->new->pretty; # prettify for human consumption

say $json->encode($tree);

sub list_children {
  my $adjac = shift;
  my $queue  = shift;
  my $nodes  = shift;

  my $node = shift @$queue;

  # all child nodes
  my @children = keys %{$adjac->{$node}};

  # except the ones we visited earlier, to avoid loops
  @children = grep { ! exists $nodes->{$_}} @children;

  $nodes->{$node} = \@children;

  # and toss on the queue
  push @$queue, @children;
}

sub build_tree {
  my $root  = shift;
  my $nodes = shift;

  my @children;
  for my $child (@{$nodes->{$root}}) {
    push @children, build_tree($child, $nodes);
  }

  my %h = ('name'     => $root,
           'children' => \@children);

  return \%h;
}
于 2012-12-18T15:47:05.067 に答える