【问题标题】:Why do I get the error "unexpected end of string while parsing JSON string" when decoding a URI-encoded JSON string?为什么在解码 URI 编码的 JSON 字符串时出现错误“解析 JSON 字符串时字符串意外结束”?
【发布时间】:2016-11-14 05:28:49
【问题描述】:

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

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

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

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

错误日志:

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

【问题讨论】:

  • 你是如何解析 JSON 的?你试过JSON.parse('[{"":"#","jednostka":"","login":"SA"}]') 吗?
  • 我不确定你为什么需要 encodeURIComponent()。没有它就不行吗?你不应该在另一边解码吗?

标签: javascript json perl post


【解决方案1】:

看起来您是在 Perl 中对其进行解码,但试图解码一个空变量名。为第一个变量命名。

【讨论】:

    【解决方案2】:

    您是否意识到您只需要为 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;
    

    输出

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

    【讨论】:

    • 其他选项是将 " 替换为 &qout;
    【解决方案3】:

    从 Perl 的 JSON::decode_json() 函数中获取“解析 JSON 字符串时字符串意外结束”的另一种方法是,如果您的 JSON 文件包含 trailing commas,如下所示:

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

    JSON specification 不允许尾随逗号(这与 URI 编码无关,顺便说一句)。您应该能够使用 JSON::Parse::valid_json() 捕获此类 JSON 格式违规。

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2012-10-04
      • 2020-07-22
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多