【问题标题】:Return a JSON object from Perl从 Perl 返回一个 JSON 对象
【发布时间】:2019-12-06 02:39:43
【问题描述】:

我对珍珠不是很熟悉,所以请原谅我的问题。 我正在尝试从子例程返回 JSON 对象,但惨遭失败。

我创建了一个.pl 文件,该文件进行查询并返回一些数据。太好了 - 我可以得到响应,这是我的数据返回该对象的样子:

# Print JSON
print encode_json({
    'status' => scalar(@$payload) > 0 ? 200 : 404,
    'message' => scalar(@$payload) > 0 ? 'OK' : 'Not found.',
    'data' => scalar(@$payload) > 0 ? $payload : []
});

// $payload = mySubRoutine({...});

实际响应如下:

{
    "message": "OK",
    "status": 200,
    "data": [
        "foo",
        8
    ]
}

技术上有效,但使用data[1] 获取数据感觉非常糟糕。

来自我的sub 我正在返回这样的数据(导致上述结果):

...
$my foo = 8;
return (["foo" => $foo]);

这就是我想要完成的:

{
    "message": "OK",
    "status": 200,
    "data": [
        {"foo":8}
    ]
}

我曾尝试像这样导出JSON 对象(并且有效):

my $json = JSON::XS::encode_json({foo => $foo});
die Data::Dumper::Dumper($json);  // $VAR1 = '{"foo":8}';

太棒了 - 越来越近了,现在我只需要从我的子程序中返回它而不是把它转储出去:

my $json = JSON::XS::encode_json({foo => $foo});
return $json;

但是,这样做会给我这个错误:

在使用“strict refs”时不能使用字符串 ("{"foo":8}") 作为 ARRAY ref

现在我自言自语,以可接受的格式从我的子例程返回数据。我还查看了this SO post 以返回JSON。我仍然遇到上述错误的某些版本。

任何有关正确语法的建议将不胜感激!

【问题讨论】:

    标签: perl


    【解决方案1】:

    这是按照你想要的方式格式化你的数据结构的问题,而不是真正的 JSON,它只是创建了你如何构建它的表示。

    Perl 中的哈希映射到 JSON 对象。您可以从按交替键值对排序的列表中创建散列,实际上与创建整体结构以传递给 encode_json 的方式相同。

    如果你的子程序返回一个 hashref 而不是一个 arrayref 作为$payload

    return {foo => $foo};
    

    并让它返回undef 而不是一个空结构来指示未找到,这是一个更清晰的指示,可以使用defined//(定义或)运算符进行测试。

    然后您可以将其设置为值,并将其编码为 JSON 对象:

    encode_json({
        'status' => defined($payload) ? 200 : 404,
        'message' => defined($payload) ? 'OK' : 'Not found.',
        'data' => $payload // {},
    });
    

    【讨论】:

    • 这正是我的想法。由于完全没有弄清楚在哪里/如何返回什么而导致的完整语法问题。我已经更新了我的脚本以返回更好的结构,然后使用了您的建议。本垒打 - 非常感谢您的宝贵时间!
    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2013-05-09
    • 2013-09-29
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多