Perl Создать строку JSON в определенном формате - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть таблица с 3 полями, которые я запрашиваю и помещаю значения в JSON. Таблица имеет имя хоста для имени приложения и идентификатора приложения. В настоящее время у меня есть Perl-скрипт, который выводит следующую строку json.

[
   {
      "app_id" : "1234",
      "app_name" : "Managed File Transfer",
      "ci_name" : "hosta7"
   },
   {
      "app_name" : "Patrtol",
      "app_id" : "1235",
      "ci_name" : "hosta7"
   },
   {
      "app_id" : "1236",
      "app_name" : "RELATIONAL DATA WAREHOUSE",
      "ci_name" : "hosta7"
   },
   {
      "ci_name" : "hosta7",
      "app_id" : "1237",
      "app_name" : "Managed File Transfer"
   },
   {
      "app_id" : "1238",
      "app_name" : "Initio Application",
      "ci_name" : "hosta7"
   },
   {
      "app_id" : "1239",
      "app_name" : "Data Warehouse Operations Infrastructure",
      "ci_name" : "hosta7"
   },
   {
      "app_id" : "2345",
      "app_name" : "Tableou",
      "ci_name" : "hostb"
   }
]

Я хочу, чтобы результирующая строка json была похожа на следующую: где, если ci_name уже существует, я хочу, чтобы новый элемент был добавлен к текущей записихоста в строке JSON. По сути, я хочу эту строку JSON

{ 
  "hosts" : [{
    "hosta" :[
      {
        "app_id": "1234",
        "app_name": "Managed File Transfer"
      },
      {
        "app_id": "1235",
        "app_name": "Patrol"
      },
      {
        "app_id": "1236",
        "app_name": "RELATIONAL DATA WAREHOUSE"
      },
      {
        "app_id": "1237",
        "app_name": "Managed File Transfer"
      },
      {
        "app_id": "1238",
        "app_name": "Initio Application"
      },
      {
        "app_id": "1239",
        "app_name": "Data Warehouse Operations Infrastructure"
      }
      ],
    "hostb" : [
      {
        "app_id": "2345",
        "app_name": "Tableou"
      }
      ]
    }]
}
#!/usr/bin/perl
use strict;
use warnings;
use JSON;

my $hosts = [
   {
      'app_id' => '1234',
      'app_name' => 'Managed File Transfer',
      'ci_name' => 'hosta7'
   },
   {
      'app_name' => 'Patrtol',
      'app_id' => '1235',
      'ci_name' => 'hosta7'
   },
   {
      'app_id' => '1236',
      'app_name' => 'RELATIONAL DATA WAREHOUSE',
      'ci_name' => 'hosta7'
   },
   {
      'ci_name' => 'hosta7',
      'app_id' => '1237',
      'app_name' => 'Managed File Transfer'
   },
   {
      'app_id' => '1238',
      'app_name' => 'Initio Application',
      'ci_name' => 'hosta7'
   },
   {
      'app_id' => '1239',
      'app_name' => 'Data Warehouse Operations Infrastructure',
      'ci_name' => 'hosta7'
   },
   {
      'app_id' => '2345',
      'app_name' => 'Tableou',
      'ci_name' => 'hostb'
   }
];
my $output;

foreach my $row (@$hosts) {
        push @$output, $row;
}
my $json = new JSON;
$json->pretty(1);
print $json->encode($output);

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы не хотите нажимать напрямую, вы хотите нажать клавишу, взятую из ci_name, и вам нужно только скопировать идентификатор и имя приложения.

for my $element (@$hosts) {
    push @{ $output->{ $element->{ci_name} } },
        { map { $_ => $element->{$_} } qw( app_id app_name ) };
}
0 голосов
/ 04 ноября 2019

Вероятно, код будет выглядеть следующим образом

#!/usr/bin/perl

use strict;
use warnings;

use JSON;
use Data::Dumper;

my $debug = 0;

my %data;

while( <DATA> ) {
    chomp;
    next if /app_id/;

    my ($app_id,$ci_name,$app_name) = split /,/;

    push @{$data{hosts}{$ci_name}}, {app_id => $app_id, app_name => $app_name };
}

print Dumper(\%data) if $debug;

my $json = encode_json \%data;

print $json;

__DATA__
app_id,ci_name,app_name
1234,hosta7,Managed File Transfer
1235,hosta7,Patrtol
1236,hosta7,RELATIONAL DATA WAREHOUSE
1237,hosta7,Managed File Transfer
1238,hosta7,Initio Application
1239,hosta7,Data Warehouse Operations Infrastructure
2345,hostb,Tableou
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...