5

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
ThisSuitIsBlackNot
  • 23,492
  • 9
  • 63
  • 110
Piotr Bielski
  • 105
  • 1
  • 2
  • 8

3 Answers3

3

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" }]
Borodin
  • 126,100
  • 9
  • 70
  • 144
  • Someone fuction after Encoding change " to %22 that was problem. I need to change value="VALUE " to value='Value'. End no change " to %22 in html. – Piotr Bielski Jul 12 '16 at 08:57
  • Other option is replace " to &qout; – Piotr Bielski Jul 12 '16 at 16:43
  • My error was in the text element: I had a return inside the string and after removing the invisible return, the `unexpected end of string` went. – Timo Feb 09 '23 at 20:49
0

Another way to get the "unexpected end of string while parsing JSON string" from Perl's JSON::decode_json() function, is if your JSON file contains trailing commas, like this:

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "width": 500,
        "height": 500,
    }  }}

The JSON specification does not allow a trailing comma (this is unrelated to URI-encoding, btw). You should be able to catch such JSON format violations using JSON::Parse::valid_json().

Trutane
  • 1,279
  • 12
  • 12
-2

It looks like you're decoding it in Perl, but attempting to decode an empty variable name. Give the first variable a name.

raduation
  • 792
  • 5
  • 11