私はパールを学んでいます。オブジェクトが配列に含まれている場合は、JSONコレクションを正常に繰り返すことができます。ただし、オブジェクトが配列になく、任意の識別子(たとえば0y7vfr1234
)を持つJSONデータを使用する方法は理解できません。事前に知らない。以下は、読んで更新し、ファイルに再保存する構造のいくつかのサンプルデータです。
{
"0y7vfr1234": {
"username": "[email protected]",
"password": "some-random-password123",
"uri": "ww1.example.com",
"index": 14
},
"v2rbz1568": {
"username": "[email protected]",
"password": "some-random-password125",
"uri": "ww3.example.com",
"index": 29
},
"0zjk1156": {
"username": "[email protected]",
"password": "some-random-password124",
"uri": "ww2.example.com",
"index": 38
}
}
これらのオブジェクトがすべて配列内にある場合は、次のようにします。
#!/usr/bin/perl
use lib qw(..);
use JSON;
binmode STDOUT, ":utf8";
use utf8;
use strict;
use warnings;
my $filename1 = 'input.json';
my $filename2 = 'serverlist.txt';
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename1)
or die("Can't open \$filename1\": $!\n");
local $/;
<$json_fh>
};
open my $server_list, '<', $filename2 or die "Can't open $filename2: $!";
my @server_list = <$server_list>;
close $server_list or die "Can't close $server_list: $!";
my $json = JSON->new;
my $data = $json->decode($json_text);
my $aref = $data->{the_array_name};
for my $setting (@$aref) {
if (length $setting->{uri}) { #no warnings
$setting->{uri} =~ m/^ww(\d+)\.example.com/;
my $server_number = $1;
print "checking $server_number ... \n";
if (grep{/$setting->{uri}/} @server_list) {
print "server number is: $server_number\n";
} else {
# 1. iterate through the sorted list
foreach (@server_list)
{
$_ =~ m/^ww(\d+)\.example.com/;
my $new_num = $1;
# 2. find the next match in order
if ( $new_num > $server_number ) {
print "Found it: new server number $new_num is greater than $server_number\n";
# TODO 3. check that it does not exist in $data->{the_array_name};
# 4. replace $setting->{uri} with new value
my $new_server = $_;
$new_server =~ s/\s+$//;
$setting->{uri} = $new_server;
last;
}
}
}
}
}
# 5. save JSON as a file to disk.
my $filename3 = 'output.json';
open my $proxy_settings, '>', $filename3 or die "Can't open $filename3: $!";
print $proxy_settings encode_json($data);
close $proxy_settings or die "Can't close $proxy_settings: $!";
これは私が書いた最初のPerlです。まだすべての内容を100%理解していません。 (例binmode STDOUT, ":utf8";
:)。私はこれが最適とは離れていると確信しており、努力し続けます。私の質問は、上記のJSON構造を使用するにはどうすればよいですか?
私はLinuxでPerl 5バージョン30を使用しています。
ベストアンサー1
このように:
#!/usr/bin/perl
use JSON;
use utf8;
use strict; use warnings;
my $data = '{
"0y7vfr1234": {
"username": "[email protected]",
"password": "some-random-password123",
"uri": "ww1.example.com",
"index": 14
},
"v2rbz1568": {
"username": "[email protected]",
"password": "some-random-password125",
"uri": "ww3.example.com",
"index": 29
},
"0zjk1156": {
"username": "[email protected]",
"password": "some-random-password124",
"uri": "ww2.example.com",
"index": 38
}
}';
my $json = decode_json $data;
foreach my $key (keys %$json) {
print "$key\n";
}
print "$json->{v2rbz1568}->{username}\n";
出力
v2rbz1568
0y7vfr1234
0zjk1156
[email protected]