2016-06-16 9 views
0

Ich habe 2 Dateien (JSON-Datei und PID-Datei). Das Format für die JSON-Datei ist:JSON zu Hash machen, dann diesen Hash mit einem anderen Hash in Perl vergleichen

{ 
"connection": { 
    "file": { 
    "file_connection_1": { 
    "CLOUD_AUTHENTICATION": "", 
    "CLOUD_CONN_PROTOCOL": "", 
    "CONN_NAME": "file_connection_1", 
    "FILE_DIR": "/home/directory" 
    } 
    } 
} 
} 

Format für pid:

<General> 
"CLOUD_AUTHENTICATION": "YES" 
"CLOUD_CONN_PROTOCOL": "PRTCL" 
"CONN_NAME": "file_connection_1" 
"FILE_DIR": "/home/directory" 
</General> 

ich beide die Dateien in Hashes konvertieren möchten, und dann die Werte der Schlüssel vergleichen (zB CLOUD_AUTHENTICATION oder CLOUD_CONN_PROTOCOL ... .). Nimm die Werte von pid und füge sie in den JSON-Datei-Hash ein, falls nicht vorhanden. Ich bin in der Lage, die Dateien in Hash zu konvertieren, aber nicht klar darüber, wie Sie die Schlüssel vergleichen und den Wert von PID-Hash auf JSON-Hash kopieren.

+0

wo und was .......... Diese zwei Punkte sind in Ihrer Frage verfehlt. Wo -> Server-Seite oder Front-End und welche Sprache verwenden Sie. – Hemakumar

+3

@Hema Entsprechend den Tags und dem Titel der Frage verwendet das OP Perl. – ThisSuitIsBlackNot

+0

Sie sollten den Code hinzufügen, den Sie bereits haben. Wie konvertieren Sie die Dateien in Hashes? Wie sehen die resultierenden Datenstrukturen aus? Zeig's ihnen. Sie können Ihre Frage bearbeiten, um diese Details hinzuzufügen. – simbabque

Antwort

2

Die Art, wie ich die Frage verstehe, haben Sie zwei Hashes, die die gleichen Schlüssel haben. Wenn der erste Wert keinen Wert für einen bestimmten Schlüssel hat, möchten Sie den Wert aus dem anderen Hash dorthin setzen.

Weil Sie nicht angegeben haben, wie Sie diese Hashes erstellen, habe ich meine eigene Lösung dafür gefunden. Sie können es wahrscheinlich ignorieren. Ich benutzte Config::General und einige Tricks, um " und : loszuwerden, um die pid-Datei und JSON für den JSON zu lesen.

use strict; 
use warnings; 
use Config::General; 
use JSON 'decode_json'; 
use Data::Dumper; 

# read the pid file 
my %cfg_pid = Config::General->new(
    -NormalizeOption => sub { my $x = shift; $x =~ s/^"|":$//g; $x; }, 
    -NormalizeValue => sub { my $x = shift; $x =~ s/^"|"$//g; $x }, 
    -ConfigFile  => \*DATA 
)->getall; 

# read the json file 
my $json = <<'JSON'; 
{ 
"connection": { 
    "file": { 
    "file_connection_1": { 
    "CLOUD_AUTHENTICATION": "", 
    "CLOUD_CONN_PROTOCOL": "", 
    "CONN_NAME": "file_connection_1", 
    "FILE_DIR": "/home/directory" 
    } 
    } 
} 
} 
JSON 

my $cfg_json = decode_json($json); 

# this is before 
print Dumper $cfg_json; 

# actual part that you want 
foreach my $key (keys %{ $cfg_pid{General} }) { 
    $cfg_json->{connection}->{file}->{file_connection_1}->{$key} = $cfg_pid{General}->{$key} 
     unless $cfg_json->{connection}->{file}->{file_connection_1}->{$key}; 
} 

# and this is after 
print Dumper $cfg_json; 

__DATA__ 
<General> 
"CLOUD_AUTHENTICATION": "YES" 
"CLOUD_CONN_PROTOCOL": "PRTCL" 
"CONN_NAME": "file_connection_1" 
"FILE_DIR": "/home/directory" 
</General> 

Alles, was es wirklich ist den Schlüssel des pid Dateihash tut laufen, und aktivieren Sie im json Hash, wenn es ein Wert dieses Schlüssels ist. Wenn dieser Wert nicht wahr ist (dh der Schlüssel existiert nicht, der Wert ist undef, ein leerer String q{} oder), wird er auf den Wert des PID-Hashes gesetzt. Sie können natürlich auch explizit nach leeren Zeichenketten suchen.

Der Ausgang ist wie folgt.

$VAR1 = { 
    'connection' => { 
     'file' => { 
      'file_connection_1' => { 
       'FILE_DIR'    => '/home/directory', 
       'CONN_NAME'   => 'file_connection_1', 
       'CLOUD_CONN_PROTOCOL' => '', 
       'CLOUD_AUTHENTICATION' => '' 
      } 
     } 
    } 
}; 
$VAR1 = { 
    'connection' => { 
     'file' => { 
      'file_connection_1' => { 
       'FILE_DIR'    => '/home/directory', 
       'CONN_NAME'   => 'file_connection_1', 
       'CLOUD_CONN_PROTOCOL' => 'PRTCL', 
       'CLOUD_AUTHENTICATION' => 'YES' 
      } 
     } 
    } 
}; 
+0

Danke @simbabque. Ich habe die Dateien auf die gleiche Weise in Hash konvertiert wie Sie. Entschuldigung, ich habe Ihnen den Code nicht zur Verfügung gestellt. Ihre Antwort scheint das korrekte Ergebnis zu geben, aber ich möchte diese Werte nicht hart codieren. Ich habe dir gerade einen Teil von json gegeben. Der Json, den ich verwende, enthält 5-10 Kategorien wie "Verbindung" und dann verschiedene Unterkategorien. Ich kann nicht alle Kategorien fest codieren. Ich dachte auch, um den Schlüssel von Pid zu Json zu vergleichen und wenn es übereinstimmt, dann den Wert erhalten. Ich weiß nicht, wie man den Schlüssel verschiedener strukturierter Hashes vergleicht. – JustStarted

+0

Außerdem können wir diesen Code einchecken: '$ cfg_json -> {Verbindung} -> {Datei} -> {Datei_Verbindung_1} -> {$ Schlüssel}' wenn Wert (Hash-Referenzname) vor $ Schlüssel gleich 'Datei_Verbindung_1 ist 'oder zweitletzter Wert (Hash-Referenzname) gleich' Datei '? – JustStarted

+0

@JustStarted Bitte aktualisieren Sie Ihre Frage und fügen Sie eine zweite Kategorie in beide Dateien ein. Sie haben nicht erwähnt, dass die Kategorien dynamisch sind. Ich verstehe nicht, was du mit deinem zweiten Kommentar meinst. Versuche es auf eine andere Art zu sagen. – simbabque