in reply to Re: How to read Array
in thread How to read Array

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.

Replies are listed 'Best First'.
Re^3: How to read Array
by rjt (Curate) on Jul 09, 2013 at 10:21 UTC

    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

        You are querying the wrong level of your structure. Compare to this

        my $output = to_json [ map { @$_ } values %{ (from_json $input)->{dns_ +zone}->{records} } ];