为什么在解码 URI 编码的 JSON 字符串时会收到错误“解析 JSON 字符串时出现意外的字符串结尾”?

Pio*_*ski 5 javascript perl post json

我正在尝试将一些 JSON 数据发布到我的 Perl 脚本,但 JSON 模块似乎无法处理这个字符串:

[{"":"#","jednostka":"","login":"SA"}]
Run Code Online (Sandbox Code Playgroud)

encodeURIComponent()在 JavaScript 中使用过,所以我的字符串实际上是这样的:

[{%22%22:%22#%22,%22jednostka%22:%22%22,%22login%22:%22SA%22}]
Run Code Online (Sandbox Code Playgroud)

错误日志:

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
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 3

您是否意识到您只需要对 GET 请求转义数据?这就是调用该函数的原因encodeURIComponent,因为生成的字符串将在 URL 中使用。在 POST 请求中,数据在消息正文中传递,而不是在 URL 中传递

我发现您正在使用该JSON::PP模块,该模块与您显示的简单 JSON 字符串配合得很好。这是一个示例程序,显示使用转储的结果数据结构Data::Dump

根据错误日志,您正在对不应该编码的 JSON 数据进行编码。如果我将下面的 JSON 数据替换为,encodeURIComponent则会收到错误消息

解析 JSON 字符串时出现意外的字符串结尾,位于字符偏移量 3 处(在“22%22:%22#%22,%22jed...”之前)

正如您所描述的,以及错误日志所确认的内容

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;
Run Code Online (Sandbox Code Playgroud)

输出

[{ "" => "#", "jednostka" => "", "login" => "SA" }]
Run Code Online (Sandbox Code Playgroud)