json décodant en perl

j’ai un json dans un fichier sample.txt

Je veux décoder json entier et imprimer les valeurs clés en spécifiant. mon par code est

#!/usr/bin/perl use JSON; use Data::Dumper; use JSON::XS qw( decode_json ); open (han1, "sample.txt") or die "can not read this file "; @array1 = ; $tst = $array1[0]; $text = decode_json $tst; print Dumper($text); 

J’ai une clé dans le nom json ‘messages_ready’. Je veux imprimer la valeur de ‘messages_ready’ ..

mon json suit

 [ { "arguments": {}, "auto_delete": false, "backing_queue_status": { "avg_ack_egress_rate": 55.02128728993393, "avg_ack_ingress_rate": 55.02128728993393, "avg_egress_rate": 55.02128728993393, "avg_ingress_rate": 109.64602476156203, "delta": [ "delta", 0, 0, 0 ], "len": 6465, "next_seq_id": 7847104, "pending_acks": 4, "persistent_count": 0, "q1": 0, "q2": 0, "q3": 0, "q4": 6465, "ram_ack_count": 4, "ram_msg_count": 6465, "target_ram_count": "infinity" }, "consumers": 4, "durable": true, "exclusive_consumer_tag": "", "memory": 19373224, "message_stats": { "ack": 7840491, "ack_details": { "rate": 60.4 }, "deliver": 7840497, "deliver_details": { "rate": 60.4 }, "deliver_get": 7840498, "deliver_get_details": { "rate": 60.4 }, "get": 1, "get_details": { "rate": 0.0 }, "publish": 7847260, "publish_details": { "rate": 105.4 }, "redeliver": 3, "redeliver_details": { "rate": 0.0 } }, "messages": 6469, "messages_details": { "rate": 74.6 }, "messages_ready": 6465, "messages_ready_details": { "rate": 74.6 }, "messages_unacknowledged": 4, "messages_unacknowledged_details": { "rate": 0.0 }, "name": "reports", "node": "rabbit@ip-10-0-0-105", "policy": "", "status": "running", "vhost": "/" }, { "arguments": {}, "auto_delete": false, "backing_queue_status": { "avg_ack_egress_rate": 0.0, "avg_ack_ingress_rate": 0.0, "avg_egress_rate": 0.0, "avg_ingress_rate": 0.0, "delta": [ "delta", "undefined", 0, "undefined" ], "len": 1, "next_seq_id": 1, "pending_acks": 0, "persistent_count": 0, "q1": 0, "q2": 0, "q3": 0, "q4": 1, "ram_ack_count": 0, "ram_msg_count": 1, "target_ram_count": "infinity" }, "consumers": 0, "durable": true, "exclusive_consumer_tag": "", "idle_since": "2013-12-31 13:03:35", "memory": 13760, "message_stats": { "publish": 1, "publish_details": { "rate": 0.0 } }, "messages": 1, "messages_details": { "rate": 0.0 }, "messages_ready": 1, "messages_ready_details": { "rate": 0.0 }, "messages_unacknowledged": 0, "messages_unacknowledged_details": { "rate": 0.0 }, "name": "test", "node": "rabbit@ip-10-0-0-105", "policy": "", "status": "running", "vhost": "/" } ] 

Comment pourrais-je le faire? aide moi ici … s’il te plait

Notez que vous n’avez pas besoin d’utiliser JSON et JSON :: XS dans un script: JSON utilisera automatiquement JSON :: XS si vous le trouvez. Donc, use JSON est le même, comme use JSON::XS , mais plus portable.

 use ssortingct; use warnings; use JSON::XS 'decode_json'; use Data::Dumper; my $data; { local $/ = undef; open my $fh, '<', 'metadata.txt'; $data = <$fh>; close $fh; } my $result = decode_json( $data ); for my $report ( @{$result} ) { print $report->{messages_ready}, "\n"; } 
  • decode_json() renvoie une référence à un tableau ou à un hachage en fonction des données. Dans ce cas, il s’agit d’une référence à un tableau de références de hachage
  • La foreach loop utilise @$json_data pour accéder aux éléments du tableau dans $json_data , en affectant chacun tour à $section . $section est maintenant une référence de hachage.
  • Utilisez $section->{some-key} pour accéder aux clés, comme dans la $section->{'messages_ready'}
  • Rappelez-vous toujours d’ use ssortingct

Quelque chose comme ça:

 #!/usr/bin/perl use ssortingct; use JSON; open (han1, "sample.txt") or die "can not read this file: $!\n"; my $json_ssortingng = join '', ; my $json_data = decode_json $json_ssortingng; foreach my $section (@$json_data) { print "messages_ready: " . $section->{'messages_ready'} . "\n"; }