簡體   English   中英

Perl Dancer - JSON序列化程序和JSON數組

[英]Perl Dancer - JSON serializer and JSON arrays

我在使用內置的用於JSON和JSON數組的Perl Dancer序列化程序時遇到問題。

我在app.pl文件中激活了序列化程序:

#!/usr/bin/env perl
use Dancer;
use main;

set serializer => 'JSON';

dance;

在模塊本身中,我測試了JSON解析,如下所示:

post '/test/' => sub {
    my $params = request->params;

    debug('Test: ', $params);
};

現在我想確保按預期解析JSON,所以我嘗試使用cURL來理解序列化程序的工作方式:

curl -H "Content-Type: application/json" -X POST http://localhost:3000/test/ -d '{ "Name" : "foo", "email" : "bar" }'

結果如預期:

Test: {'Name' => 'foo','email' => 'bar'}

但是試圖發送一個數組:

curl -H "Content-Type: application/json" -X POST http://localhost:3000/test/ -d '[{ "Name" : "foo", "email" : "bar" }]'

導致:

Test: {}

我希望序列化程序返回一個數組引用,但它似乎返回一個空哈希。 我嘗試反過來使用序列化程序,但編碼JSON似乎按預期工作。 我做錯了什么?

以為我有代碼執行此操作,但是,錯了。

我無法讓params解析任何深度的東西。 也許這是設計但是,從文檔中我並不是很清楚。

直接使用from_json函數,您可以解析包含POST'd JSON字符串的request-> body:

注意:我使用Data :: Dumper打印變量內容,試圖讓它更清晰一些。

post '/test/' => sub {
 #my @params =   params  ;
 #my @params =   request->body;
 my $body = request->body;

 my $j_O = from_json( $body );

 #deubg( 'Test1: ' . Dumper( request->body ) );
 #debug( 'Test2: ' . Dumper( request->params ) );
 #debug( 'Test3: ' . Dumper( { params }  ) );
 debug( 'Test4: ' . Dumper( $body ) );
 debug( 'Test5: ' . Dumper( $j_O ) );


};

OUTPUT:

[27993] debug @0.001528> [hit #2]Test4: $VAR1 = '[ { "Name" : "foo", "email" : "bar" }, { "Name" : "bar"} ]'; in /media/truecrypt1/Projects/Perl5+/Dancer/Test/lib/Test.pm l. 23
[27993] debug @0.001772> [hit #2]Test5: $VAR1 = [
          {
            'email' => 'bar',
            'Name' => 'foo'
          },
          {
            'Name' => 'bar'
          }
        ];

我遇到過同樣的問題。 Dancer序列化程序框架不能反序列化除HASH數據類型之外的任何內容。 我懷疑這是因為在Dancer內部你可以做諸如params->{'foo'}來獲取元素。 這個代碼在Dancer :: Serializer(〜第110行)就是這個原因。

if (!ref $new_params or ref $new_params ne 'HASH') {
    return $request;
}

對我來說,有一些方法需要將數組傳遞給請求。 這導致我無法使用標准的序列化程序框架,但我想在config.yml中保留相同的選項。

這是我的解決方案:

  my $json_object = from_json(request->body, config->{'engines'}->{'JSON'});

這將使用您在config.yml中為JSON引擎指定的配置選項返回JSON對象(Array或HashRef)。 您可能想要也可能不想將其包裝在eval中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM