【问题标题】:parse form (POST) data to create a multidimensional hash解析表单 (POST) 数据以创建多维散列
【发布时间】:2014-10-11 15:49:05
【问题描述】:

我有一个表单,用于提交有关多人的数据。每个人都有多个属性,我将它们分组如下:

<input type=hidden name="person1[firstname]" value='Sam'/>
<input type=hidden name="person1[lastname]" value='Higgins'/>

<input type=hidden name="person2[firstname]" value='Jiminy'/>
<input type=hidden name="person2[lastname]" value='Cricket'/>

...etc

当我执行以下操作时:

my %hash = params;
die Dumper \%hash;

我明白了:

VAR1 = {
          'person1[firstname]' => 'Sam',
          'person1[lastname]' => 'Higgins',
          'person2[firstname]' => 'Jiminy',
          'person2[lastname]' => 'Cricket',
};

当我期待这样的事情时:

VAR1 = {
          'person1' => { firstname => 'Sam', lastname => 'Higgens' },
          'person2' => { firstname => 'Jiminy', lastname => 'Cricket' },
};

有没有办法获得上述内容,还是我在 HTML 中做错了?

编辑

我也试过在最后用空括号:

<input type=hidden name="person1[firstname][]" value='Sam'/>

但这只是给了:

'person1[firstname][]' => 'Sam',

【问题讨论】:

  • 您可以通过输入名称person[1][firstname]person[1][lastname]... 来让您的表单生活更轻松,因为Dancer 似乎不会从输入创建多维结构。嗯。
  • 我尝试通过将JSON 转换为json 字符串来使用它,但这仍然给了我person1[firstname] 的密钥
  • 我希望不要走这条路,但似乎我将不得不通过正则表达式并在 perl 中创建我自己的数据结构,按照stackoverflow.com/questions/19521690/…
  • Here's a JSFiddle 使用formToObject.js 对表单数据进行编码。这可能会使您不必创建数据结构!
  • @ialarmedalien 我最终使用了github.com/marioizquierdo/jquery.serializeJSON,因为 formToObject 给了我只读元素的 TypeErrors。我真的很感激他们提出了其他类似的解决方案,非常无私,这很棒

标签: html perl hash dancer


【解决方案1】:
#!/usr/bin/perl
use Data::Dumper;
my $orginal = {
          'person1[firstname]' => 'Sam',
          'person1[lastname]' => 'Higgins',
          'person2[firstname]' => 'Jiminy',
          'person2[lastname]' => 'Cricket',
};  

my $result = {};
foreach my $key (keys %$orginal)
{
    $value = $orginal->{$key};
     $key =~ m/^(.*)\[(.*)\]$/;

     #$1 = for example person1
     #$2 = forexample firstname
     $result->{$1}->{$2} = $value;


}

print Dumper($result);
#RESULT:

# $VAR1 = {
#           'person1' => {
#                          'firstname' => 'Sam',
#                          'lastname' => 'Higgins'
#                        },
#           'person2' => {
#                          'firstname' => 'Jiminy',
#                          'lastname' => 'Cricket'
#                        }
#         };

【讨论】:

  • 谢谢卢克,不过我选择了一个不需要自己制作结构的解决方案
【解决方案2】:

比提供链接更全面地回答问题:

我采用了一个使用 jQuery 的解决方案,特别是使用插件 (https://github.com/marioizquierdo/jquery.serializeJSON) 异步发送数据 (AJAX) 并使用 Dancers from_json 方法创建 JSON 字符串的 hashref em>。

我强调字符串是因为 serializeJSON 插件提供的函数创建了一个 JSON 对象,而这个 Dancer 并没有转换成正确的结构。因此,您需要使用JSON.stringify() 创建一个 json 字符串,Dancer 确实接受它:)

下面是代码:

示例 HTML:

<input type=hidden name="person1[firstname]" value='Sam'/>
<input type=hidden name="person1[lastname]" value='Higgins'/>

JS(jQuery):

var formData = $(this).serializeJSON();
console.log(formData);
$.ajax({
     'url': '/your_url',
     'type': 'POST',
     'data': JSON.stringify(formData),
     'success': function(res){
         console.log(res);
   }
 });

Perl(舞者):

post '/your_url' => sub {
    my $json = request->body;
    use Data::Dumper;
    my $hashref = {};
    $hashref = from_json($json);
    die Dumper \$hashref->{person1}->{name}; # 'Sam'
}

感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多