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

Posted

技术标签:

【中文标题】将多维表单数据序列化为 JSON 对象数组以使用 application/json【英文标题】:Serialize multidimensional form data into a JSON object-array to work with application/json 【发布时间】:2015-12-17 15:49:28 【问题描述】:

我正在构建一个 Laravel 应用程序。在后端,如果请求的内容类型为application/json,则$controller->wantsJson()方法为TRUE。所以,为了满足这一点,我的 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",

这当然行不通。我需要某种可以转换这种形式的正则表达式解析器...

<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',
        ]
    

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

【问题讨论】:

在 jQuery 中,'type' 只是 'method' 的别名。你不应该两者都需要。 【参考方案1】:

我遇到了同样的问题,但这个包成功了:jQuery Serialize Object

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

$('form#contact').serializeJSON(); // to get the form as a JS object

【讨论】:

这只会返回键值对,而不是完全作为嵌套对象。 @AryehArmon 是什么意思?你检查过jQuery Serialize Object 的文档吗? 对不起,我以为是serializeArray【参考方案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

希望对您有所帮助。

【讨论】:

【参考方案3】:

我同意@mdamia 这是更详细的 sn-p。

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"
      ]
   

【讨论】:

以上是关于将多维表单数据序列化为 JSON 对象数组以使用 application/json的主要内容,如果未能解决你的问题,请参考以下文章

使用Jettison的多维数组

javascript-js将form表单序列化[json字符串数组对象]

json数据重组

将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串

JSON.Net 将集合序列化为数组数组

将表单序列化为没有空值的 json