将多维表单数据序列化为JSON对象数组以与application / json一起使用

时间:2015-09-21 03:21:58

标签: javascript jquery json ajax laravel

我正在构建一个Laravel应用程序。在后端,如果请求的内容类型为$controller->wantsJson(),则TRUE方法为application/json。所以,为了满足这个要求,我的jQuery AJAX调用是这样的。

jQuery.ajax({
    type:        "POST",
    method:      "PUT",
    url:         $form.attr('action'),
    data:        $form.serialize(),
    dataType:    "json",
    contentType: "application/json; charset=utf-8"
})

这正确触发了我需要的wantsJson()响应。那么问题是jQuery无法正确地提供POST数据application/json。它尝试将其写为查询字符串,当它收到该内容类型时,它不适用于PHP后端。

为了满足这一要求,我需要将JavaScript对象数组字符串化为data字段。

JSON.stringify(dataObj)

所以现在的问题是,我没有将多维表单转换为对象数组的简洁方法。如果我只是尝试转换$.serializeArray()的输出,我得到了这个,后端无法解释。

{
    'something' : 1,
    'field[foo]' : 2,
    'field[bar][]' : "a",
    'field[bar][]' : "b",
    'field[bar][]' : "c",
}

那当然不行。我需要某种可以转换此表单的RegEx解析器...

<input name="something" value="1" />
<input name="field[foo]" value="2" />
<input name="field[bar][]" value="a" />
<input name="field[bar][]" value="b" />
<input name="field[bar][]" value="c" />

进入......

{
    'something' : 1,
    'field'     : {
        'foo'   : 2,
        'bar'   : [
            'a',
            'b',
            'c',
        ]
    }
}

你希望这样的东西已经存在,但我找不到任何令人满意的东西。

3 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,但是这个软件包可以解决问题:jQuery Serialize Object

它易于使用,只需在表单上调用(加载脚本后)

SELECT * FROM players WHERE pick IS NULL AND position=? ORDER BY field DESC LIMIT 10

答案 1 :(得分:2)

您可以使用PHP parse_str

  

parse_str - 将字符串解析为变量

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

希望得到这个帮助。

答案 2 :(得分:0)

我同意@mdamia 这是更详细的代码段。

JSON.stringify(dataObj);之后,您将获得一个json字符串,如下所示:

JSON:

[
   {
      "name":"something",
      "value":"1"
   },
   {
      "name":"field[foo]",
      "value":"2"
   },
   {
      "name":"field[bar][]",
      "value":"a"
   },
   {
      "name":"field[bar][]",
      "value":"b"
   },
   {
      "name":"field[bar][]",
      "value":"c"
   }
]

PHP代码:

<?php
//your raw json string
$rawData = '[{"name":"something","value":"1"},{"name":"field[foo]","value":"2"},{"name":"field[bar][]","value":"a"},{"name":"field[bar][]","value":"b"},{"name":"field[bar][]","value":"c"}]';

$json = json_decode($rawData);

$string = '';
foreach($json as $key => $val){
    $string .= $val->name.'='.$val->value.'&';
}

parse_str(rtrim($string,'&'),$data);

//var_dump($data);
echo json_encode($data); //your requied data
?>

//输出

{
   "something":"1",
   "field":{
      "foo":"2",
      "bar":[
         "a",
         "b",
         "c"
      ]
   }
}