【问题标题】:json decoding in perlperl中的json解码
【发布时间】:2014-01-19 02:02:15
【问题描述】:

我在文件 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": "/"
    }
]

我该怎么做?在这里帮帮我...请

【问题讨论】:

  • 如果你没有使用 JSON::XS 提供的所有东西,我建议你使用 JSON::Tiny,JSON::Tiny 顾名思义,开销很小,如果性能更好,效果会更好对你很重要

标签: linux json perl


【解决方案1】:

请注意,您不需要在一个脚本中使用 JSON 和 JSON::XS:如果 JSON 找到它,它将自动使用 JSON::XS。所以use JSONuse 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";
}

【讨论】:

    【解决方案2】:
    • decode_json() 根据数据返回 reference 到数组或散列。在这种情况下,它是一个 对哈希引用数组的引用
    • foreach loop 使用@$json_data 访问$json_data 中的数组元素,将每个元素依次分配给$section$section 现在是一个哈希引用。
    • 使用$section-&gt;{some-key} 访问密钥,如$section-&gt;{'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";
    }
    

    【讨论】:

    • 现在不要给我意见 Kenosis... ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2021-10-13
    • 2015-08-25
    • 2016-05-31
    • 2018-12-24
    • 2014-11-15
    相关资源
    最近更新 更多