将多维表单数据序列化为 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的主要内容,如果未能解决你的问题,请参考以下文章
javascript-js将form表单序列化[json字符串数组对象]