Json decoding in perl

I have json in sample.txt file

I want to decode integer values ​​of json and print key by specifying. my code is equal

#!/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 = <han1>; $tst = $array1[0]; $text = decode_json $tst; print Dumper($text); 

I have a key in json name 'messages_ready'. I want to print the value "messages_ready".

my json follows

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

How can I do it? help me here ... please

+8
json linux perl
source share
2 answers

Note that you do not need to use JSON and JSON :: XS in the same script: JSON will automatically use JSON :: XS if it finds it. Thus, use JSON same as use JSON::XS , but more portable.

 use strict; 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"; } 
+9
source share
  • decode_json() returns a reference to an array or hash depending on the data. In this case, it is a reference to an array of hash links
  • foreach loop uses @$json_data to access the array elements in $json_data , assigning $section to each in turn. $section now a hash link.
  • Use $section->{some-key} to access the keys, as in $section->{'messages_ready'}
  • Always remember use strict

Something like that:

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

All Articles