Piotr Bielski Piotr Bielski - 4 months ago 33
Perl Question

Why do I get the error "unexpected end of string while parsing JSON string" when decoding a URI-encoded JSON string?

I'm trying to POST some JSON data to my Perl script, but the JSON module seems to be unable to cope with this string:

[{"":"#","jednostka":"","login":"SA"}]


I used
encodeURIComponent()
in JavaScript, so my string actually looks like this:

[{%22%22:%22#%22,%22jednostka%22:%22%22,%22login%22:%22SA%22}]


Error log:

JSON::PP::decode_error('unexpected end of string while parsing JSON string') called at C:\strawberry\perl\lib/JSON/PP.pm line 837
| JSON::PP::string() called at C:\strawberry\perl\lib/JSON/PP.pm line 960
| JSON::PP::object() called at C:\strawberry\perl\lib/JSON/PP.pm line 724
| JSON::PP::value() called at C:\strawberry\perl\lib/JSON/PP.pm line 907
| JSON::PP::array() called at C:\strawberry\perl\lib/JSON/PP.pm line 725
| JSON::PP::value() called at C:\strawberry\perl\lib/JSON/PP.pm line 688
| JSON::PP::PP_decode_json('JSON::PP=HASH(0xd0c2534)', '[{%22%22:%22#%22,%22jednostka%22:%22%22,%22login%22:%22SA%22}]', 0) called at C:\strawberry\perl\lib/JSON/PP.pm line 148

Answer

Do you realise that you ned to escape the data only for GET requests? That's why the function is called encodeURIComponent, because the resulting string is for use within a URL. In POST requests the data is passed in the message body, not in the URL

I see that you're using the JSON::PP module, which works fine with the simple JSON string that you show. Here's an example program that shows the resulting data structure dumped using Data::Dump

Acccording to the error log you're encoding the JSON data when you shouldn't be. If I replace the JSON data below with encodeURIComponent then I get the error message

unexpected end of string while parsing JSON string, at character offset 3 (before "22%22:%22#%22,%22jed...")

which is as you described, and what the error log confirms

use strict;
use warnings 'all';

use JSON::PP;
use Data::Dump;

my $json = '[{"":"#","jednostka":"","login":"SA"}]';

my $data = JSON::PP::decode_json($json);

dd $data;

output

[{ "" => "#", "jednostka" => "", "login" => "SA" }]