J'ai une table avec 3 champs que je recherche et met les valeurs dans un JSON. La table a un nom d'hôte pour le nom et l'ID d'application. J'ai actuellement un script perl qui génère la chaîne json suivante.

[
   {
      "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"
   }
]

Je veux la chaîne json résultante comme la suivante où si le ci_name existe déjà, je veux que le nouvel élément soit ajouté à l'entrée actuelle de l'hôte dans la chaîne JSON. Donc, essentiellement, je veux cette chaîne 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);
-1
Ravi M 4 nov. 2019 à 02:55

2 réponses

Vous ne voulez pas pousser directement, vous voulez pousser sous une clé tirée de ci_name, et vous voulez seulement copier l'identifiant et le nom de l'application.

for my $element (@$hosts) {
    push @{ $output->{ $element->{ci_name} } },
        { map { $_ => $element->{$_} } qw( app_id app_name ) };
}
1
choroba 4 nov. 2019 à 10:31

Le code ressemblera probablement à l'extrait suivant

#!/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
0
Polar Bear 4 nov. 2019 à 18:25