in reply to Re: Not an ARRAY reference
in thread Not an ARRAY reference

Thanks for responding. Please check the data structure that i am looping for pagination. There are 200 same kinds of links like below

<https://ssoqa.abcoffice.com/api/v1/users?after=200abcdefghijklmno55&l +imit=200>; rel="next"https://ssoqa.abcoffice.com/api/v1/users?after=2 +00abcdefghijklmno5&limit=200https://ssoqa.abcoffice.com/api/v1/users? +after=200abcdefghijklmno55&limit=200<https://ssoqa.abcoffice.com/api/ +v1/users?after=200abcdefghijklmno55&limit=200>; rel="self",

There are data structure that i am writing for report and looping for loop . Please check below.

[ { 'status' => 'ACTIVE', 'activated' => '2020-04-29T17:58:43.000Z', 'created' => '2020-04-29T17:58:42.000Z', '_links' => { 'self' => { 'href' => 'https://ssoqa.abcoffi +ce.com/api/v1/users/abcdefghijklmno55' } }, 'passwordChanged' => undef, 'lastUpdated' => '2020-11-06T19:09:08.000Z', 'id' => '00abcdefghijklmn6', 'lastLogin' => '2020-10-05T15:16:53.000Z', 'profile' => { 'email' => 'soula.olla@abc.com', 'middleName' => 'Y', 'countryCode' => 'IN', 'login' => '123456789@ADSYF.SYFBANK.COM', 'streetAddress' => '14-45,idhaian', 'organization' => 'ABC Organization', 'employeeNumber' => '123456789', 'division' => 'ABC - IT', 'AWSrole' => [], }, 'type' => { 'id' => 'omstdyc' }, 'credentials' => { 'provider' => { 'type' => 'AD', 'name' => 'AD.COM' } }, 'statusChanged' => '2020-06-01T08:56:35.000Z' }, { 'id' => '00mnopqrstq6', 'lastLogin' => ${\$VAR1->[0]{'passwordChanged'}}, 'profile' => { 'managerId' => '2456789', 'userType' => 'Contract', 'city' => 'Stamford', 'zipCode' => '00009', 'JobFunction' => 'IT', 'manager' => 'Kal, R', 'department' => 'IT - IN - CS&T - Client Ec +om', 'displayName' => 'Bh, M', 'lastName' => 'Bht', 'streetAddress' => '7 Lo Ri Rd', 'email' => 'R.Kal@syf.com', }, 'type' => { 'id' => 'obcdefghijklmn5' }, 'credentials' => { 'provider' => { 'type' => 'AD', 'name' => 'AD.ABC.COM' } }, 'statusChanged' => '2020-04-29T17:58:49.000Z', 'status' => 'ACTIVE', 'activated' => '2020-04-29T17:58:49.000Z', 'created' => '2020-04-29T17:58:47.000Z', '_links' => { 'self' => { 'href' => 'https://ssoqa.abc.com +/api/v1/users/00abcdefghijkl6' } }, 'passwordChanged' => ${\$VAR1->[0]{'passwordChanged'}}, 'lastUpdated' => '2020-11-06T19:09:10.000Z' }, ]

I am getting an error after few times running the code - "JSON error at line 1, byte 1/156: Unexpected character 'C' parsing initial state: expecting whitespace: 'n', '\r', '\t', ' ' or start of string: '"' or digit: '0-9' or minus: '-' or start of an array or object: '{', '[' or start of literal: 't', 'f', 'n' at All-users-Apps.pl line 158." - Please let me know is this is a code issue or network issue.

do { # Run get the users run_api_call($apiurlapplog1); @responsetext = parse_json ($client->responseContent()); push @responsetextall, @responsetext; $linkheader = $client->responseHeader("Link"); print $linkheader; if ($linkheader=~ m/next/) { (my $link1 = $linkheader) =~ s/ .*? (self)/$1/gx; (my $link2 = $link1) =~ s/self/$1/g; (my $link3 = $link2) =~ s/</$1/g; (my $link4 = $link3) =~ s/>/$1/g; (my $link5 = $link4) =~ s/;/$1/g; (my $link6 = $link5) =~ s/ /$1/g; (my $link7 = $link6) =~ s/=\"/$1/g; (my $link8 = $link7) =~ s/relnext/$1/g; (my $link9 = $link8) =~ s/"/$1/g; (my $link10 = $link9) =~ s/,/$1/g; print $link10; print $link10; #$linkheader =~ s/next/$1/g; $apiurlapplog1 = $link10; } } while ($linkheader=~ m/next/); for my $i (0..$#responsetextall) { $responsetextall[$i] =~ s/]\[/,/g; for my $j (0..$#{$responsetextall[$i]}) { my $responseid = $responsetextall[$i][$j]{id}; my $responsests = $responsetextall[$i][$j]{status}; if ($responsests ne "Deactivated") { + run_api_call($apiurluser. $responseid . $apiurl2); my @responsetext4 = parse_json ($client->responseContent()); my $responsecode1 = $client->responseCode() ; for my $m (0..$#responsetext4) { for my $n (0..$#{$responsetext4[$m]}) { + $response1 = $responsetext4[$m][$n]{id}; $resplable = $responsetext4 [$m][$n]{l +abel}; push @mouapps, $resplable; } } my $newurl = ($apiurluser . $responseid ); + run_api_call($newurl); + my @responsetext1 = parse_json ($c +lient->responseContent()); print Dumper @responsetext1 ; for my $l (0..$#responsetext1) { my $response2 = $responsetext1[$l]{id}; my $response3 = $responsetext1[$l]{profile}{firstName}; my $response4 = $responsetext1[$l]{profile}{lastName}; my $response5 = $responsetext1[$l]{profile}{email}; my $response6 = $responsetext1[$l]{credentials}{provide +r}{name}; ## Wrting to the reporting file. $worksheet->write(0, 0, 'OKTA-ID'); $worksheet->write(0, 1, 'FIRST NAME'); $worksheet->write(0, 2, 'LAST NAME'); $worksheet->write(0, 3, 'EMAIL-ID'); $worksheet->write(0, 4, 'Profile-Master'); $worksheet->write(0, 5, 'APPS'); $worksheet->write($r, 0, $response2); $worksheet->write($r, 1, $response3); $worksheet->write($r, 2, $response4); $worksheet->write($r, 3, $response5); $worksheet->write($r, 4, $response6); foreach (@mouapps) { local $" = '|'; my $response7 = join ("|","@mouapps"); $worksheet->write($r, 5, $response7); } $r += 1; } } else { print "Do Nothing" ; } } }

2020-11-08 Athanasius fixed over-long line.

Replies are listed 'Best First'.
Re^3: Not an ARRAY reference
by roboticus (Chancellor) on Nov 08, 2020 at 15:09 UTC

    chandantul:

    I am getting an error after few times running the code
    "JSON error at line 1, byte 1/156: Unexpected character 'C' parsing in +itial state: expecting whitespace: 'n', '\r', '\t', ' ' or start of s +tring: '"' or digit: '0-9' or minus: '-' or start of an array or obje +ct: '{', '[' or start of literal: 't', 'f', 'n' at All-users-Apps.pl +line 158."
    Please let me know is this is a code issue or network issue.

    With an error like this, it's not likely to be either a code or network issue. The error message is telling you that it's having trouble parsing the JSON data, so it's almost certainly a data issue. Since it tells you where in the data the error is, you should look at the JSON data to see what it looks like, and see if there's an obvious data problem.

    Normally when I see a JSON error, it comes down to one of the following:

    • There was an error on the server and instead of it sending JSON, it sent an error message and my code failed to check for errors before parsing the JSON.
    • Someone created the JSON by just pasting strings together rather than a JSON library, and they created some bogus JSON with an error like:
      • A text string contained a newline, so the JSON record was unterminated.
      • A text string contained a quote breaking the JSON quoting rules.
      • The sender got some trace/debug messages mixed up in the JSON string.
      • . . . other cases I don't recall off hand . . .
    • There's a mismatch in the encoding/decoding (for unicode, HTML entities, or other) that's butchered the JSON. This is one of the cases where it's more likely to be a code issue than a data issue, as the code steps on the data.
    • Congratulations! you've found a bug in a JSON routine... Note: Very unlikely if you're using a decent JSON package, as it would be used by many thousands of people in many applications. I won't say impossible as I've found a couple compiler bugs in several decades of programming, but I'd take a hard look at the incoming JSON code, my own code that processed the data long before I'd start suspecting a bug in a well-used / well-tested JSON library. I've never actually encountered this situation, I just included it for completeness.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

    2020-11-09 Athanasius fixed over-long line.

      Thanks for your responses. I have also observed that JSON parsing is fine till 4000 but its complaining against 4001 lines but when i ran my code 2nd time its got stuck at 8000 lines and so on. How i can ignore the problem line and go to next line. and Continue

        chandantul:

        If you've got one JSON entry per line and are using the JSON package from cpan.org, then you'd handle the exception something like this:

        use warnings; use strict; use JSON; . . . # Build a JSON parser my $json = JSON->new->allow_nonref; # Process the lines in the file, we're labelling the WHILE loop to mak +e it obvious # where we skip to after handling the exception JSON_RECORD: while (my $line = <INFILE>) { # We'll declare the variable so we can use it outside of the eval my $data; # Parse the data inside the eval so we can catch the error eval { $data = $json->decode($line); }; # Now we can check $@ to see if we had an exception if ($@) { # parse failed, so log it and let the user know print "JSON parse failed on line $.\n"; print "error was: $@\n"; print "JSON we tried to parse <<$line>>\n\n"; # Now that we've handled the exception, skip to the next recor next JSON_RECORD; } # OK if we get here, we've successfully parse the JSON data, so we + can do what # we normally do now. . . . }

        ...roboticus

        When your only tool is a hammer, all problems look like your thumb.