Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: How to read Array

by rjt (Curate)
on Jul 08, 2013 at 11:58 UTC ( [id://1043102]=note: print w/replies, xml ) Need Help??


in reply to How to read Array

JSON to the rescue.

use JSON; use Data::Dump qw/dump/; # Debugging only my $raw = <>; # Raw JSON text from your post my $decoded = decode_json $raw; say $decoded->[0]->{dns_zone}->{records} ->{SOA}->[0]->{dns_record}->{expire}; # dump $decoded; # Whole mess

Output:

2419200

While a discussion of Unicode is beyond the scope of this post, be aware that you will probably have to deal with some kind of source encoding, like utf8, but don't count on it.

Replies are listed 'Best First'.
Re^2: How to read Array
by sunilgame (Initiate) on Jul 09, 2013 at 05:13 UTC

    Thanks for your feedback

    Below is my JSON Array

    {"dns_zone": {"created_at":"2013-07-08T02:21:57-05:00","id":752,"name" +:"aresstest.com","updated_at":"2013-07-08T02:21:57-05:00","user_id":1 +36, "records":{ "SOA":[{"dns_record":{"expire":2419200,"hostmaster":"ns1.qwkdns.com"," +id":122329,"minimum":10800,"name":"@","primaryNs":"ns1.qwkdns.com","r +efresh":7200,"retry":900,"serial":2013032112,"ttl":86400,"type":"SOA" +}}], "NS":[{"dns_record":{"hostname":"ns1.qwkdns.com","id":122325,"name": +"aresstest.com","ttl":86400,"type":"NS"}},{"dns_record":{"hostname":" +ns2.qwkdns.com","id":122326,"name":"aresstest.com","ttl":86400,"type" +:"NS"}},{"dns_record":{"hostname":"ns3.qwkdns.com","id":122327,"name" +:"aresstest.com","ttl":86400,"type":"NS"}},{"dns_record":{"hostname": +"ns4.qwkdns.com","id":122328,"name":"aresstest.com","ttl":86400,"type +":"NS"}}], "A":[{"dns_record":{"id":122332,"ip":"173.236.102.246","name":"local +host.aresstest.com","ttl":14400,"type":"A"}},{"dns_record":{"id":1223 +33,"ip":"173.236.102.246","name":"ftp","ttl":14400,"type":"A"}},{"dns +_record":{"id":122334,"ip":"173.236.36.138","name":"mail","ttl":14400 +,"type":"A"}},{"dns_record":{"id":122335,"ip":"173.236.102.246","name +":"webmail","ttl":14400,"type":"A"}},{"dns_record":{"id":122337,"ip": +"173.236.36.138","name":"autodiscover","ttl":14400,"type":"A"}}], "CNAME":[{"dns_record":{"hostname":"aresstest.com","id":122336,"name +":"www","ttl":14400,"type":"CNAME"}}], "MX":[{"dns_record":{"hostname":"mail.aresstest.com","id":122330,"na +me":"@","priority":0,"ttl":14400,"type":"MX"}}], "TXT":[{"dns_record":{"id":122331,"name":"@","ttl":14400,"txt":"v=sp +f1 ip4:173.236.102.246 +a +mx +ip4:173.236.36.138 ?all","type":"TXT"} +}] }}}

    How to read above array need to below output

    my $json = '[{"dns_record":{"ip":"192.64.179.9","ttl":"86400","name":" +@","hostname":"ns1.qwkdns.com.","type":"soa"}}, {"dns_record":{"ip":"aresstest.com.","ttl":"86400","n +ame":"aresstest.com.","hostname":"ns1.qwkdns.com.","type":"ns"}}, {"dns_record":{"ip":"aresstest.com.","ttl":"86400","n +ame":"aresstest.com.","hostname":"ns2.qwkdns.com.","type":"ns"}}, {"dns_record":{"ip":"aresstest.com","ttl":"86400","na +me":"aresstest.com.","hostname":"192.64.179.10","type":"a"}}, {"dns_record":{"ip":"localhost","ttl":"14400","name": +"localhost.aresstest.com.","hostname":"127.0.0.1","type":"a"}}, {"dns_record":{"ip":"aresstest.com.","hostname":"ares +stest.com.","ttl":"14400","name":"14400","type":"mx","mx_priority":"0 +"}}, {"dns_record":{"ip":"mail","ttl":"14400","name":"1440 +0","hostname":"aresstest.com.","type":"cname"}}, {"dns_record":{"ip":"www","ttl":"14400","name":"14400 +","hostname":"aresstest.com.","type":"cname"}}, {"dns_record":{"ip":"ftp","ttl":"14400","name":"14400 +","hostname":"aresstest.com.","type":"cname"}}, {"dns_record":{"txt":"spf1 ip4:173.236.102.246 +a +mx + +ip4:173.236.36.138 ?all","ttl":"14400","name":"14400","hostname":"a +resstest.com.","type":"txt"}} ]';
    Awaiting your feedback.

      By the looks of it, you want to print out all of the dns_record entries that exist within array refs for each record type (A, NS, CNAME), and then put the resulting data back into JSON form, essentially transforming one JSON response to a different format, right?

      You should have the information to start coding. Here's a basic outline: Feed your new input into my earlier example, uncomment the dump line, take a look at the result, and use that to figure out the reference path you need to get at the desired records. Once you have that, build a new ARRAY ref and push each (group of) dns_record you obtain. Finally, feed that ARRAY ref into JSON's encode_json (utf8) or to_json (no deliberate encoding), and you'll have your required output.

      Then I'd recommend you gather as much diverse real-world input as you can, and create a suite of unit tests with Test::More, as systems integration work is fundamentally a little imprecise; robust solutions are especially important here.

        Thanks, Yes I want all dns_record entries. In above example I need read all records for "A,NS,CNAME" records type "$json->{dns_zone}->{records}->{A}" I am trying use below script

        $data = Cpanel::JSON::Load($json); my @dns_records; @dns_records = { map { $_->{dns_zone}->{records}->{A}->{dns_record}-> +{name} => $_->{dns_zone}->{records}->{A}->{dns_record}->{name} } @{$d +ata} };

        Please guide what's wrong in my script

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1043102]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2024-03-28 16:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found