我在文件sample.txt中有一个json
我想通过指定解码整个json和打印键值。我的每个代码是
#!/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);
我在json名称'messages_ready'中有一个键。我想打印'messages_ready'的价值..
我的json是以下
[
{
"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": "/"
}
]
我该怎么做?请帮助我......请
答案 0 :(得分:9)
请注意,您不需要在一个脚本中使用JSON和JSON :: XS:如果找到它,JSON将自动使用JSON :: XS。因此use JSON
与use JSON::XS
相同,但更具便携性。
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";
}
答案 1 :(得分:9)
decode_json()
会根据数据将 reference返回到数组或哈希。在这种情况下,它是对哈希引用数组的引用 foreach loop
使用@$json_data
访问$json_data
中的数组元素,并依次将每个元素分配给$section
。 $section
现在是哈希引用。$section->{some-key}
访问密钥,如$section->{'messages_ready'}
use strict
这样的事情:
#!/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";
}