Как создать конкретный объект json в Perl - PullRequest
0 голосов
/ 03 мая 2019

Я пишу скрипт, который позволяет создавать объект json с информацией о конкретном графике для использования с SigmaJS.

Важно подчеркнуть, что пользователь должен указать, сколько итераций необходимо выполнить, чтобы определитьколичество узлов, которые будут существовать в графе.Я новичок в этом языке, в коде поместите итерации в 5, например.

use strict;
use warnings;
use JSON;
my $json_obj = new JSON;
my %perl_data;


for (my $i=0; $i <= 5 ; $i++) {
    $perl_data{nodes} = [{id => "..", label => "..", label => "..", x => ".." , y => ".." , size => ".."}];
    $perl_data{edges} = [{id => "..", source => "..", target => "..", color => ".."}];
}


print $json_obj->pretty->encode(\%perl_data);

Я получаю такой результат:

{
   "nodes" : [
      {
         "x" : "..",
         "id" : "..",
         "y" : "..",
         "label" : "..",
         "size" : ".."
      }
   ],
   "edges" : [
      {
         "target" : "..",
         "id" : "..",
         "color" : "..",
         "source" : ".."
      }
   ]
}

Но мне нужно что-то подобное:

{
  "nodes": [
    {
      "id": "n0",
      "label": "A node",
      "x": 0,
      "y": 0,
      "size": 3
    },
    {
      "id": "n1",
      "label": "Another node",
      "x": 3,
      "y": 1,
      "size": 2
    },
    {
      "id": "n2",
      "label": "And a last one",
      "x": 1,
      "y": 3,
      "size": 1
    }
  ],
  "edges": [
    {
      "id": "e0",
      "source": "n0",
      "target": "n1"
    },
    {
      "id": "e1",
      "source": "n1",
      "target": "n2"
    },
    {
      "id": "e2",
      "source": "n2",
      "target": "n0"
    }
  ]
}

1 Ответ

2 голосов
/ 03 мая 2019

Вы постоянно устанавливаете $perl_data{nodes} и $perl_data{edges} вместо добавления к массивам, на которые они ссылаются.

my %perl_data = (
   nodes => [],
   edges => [],
);

for my $i (0..5) {
   push @{ $perl_data{nodes} }, {
      id    => "..",
      label => "..",
      x     => "..",
      y     => "..",
      size  => "..",
   };

   push @{ $perl_data{edges} }, {
      id     => "..",
      source => "..",
      target => "..",
      color  => "..",
   };
}
...