将输入值形成为 JSON

Posted

技术标签:

【中文标题】将输入值形成为 JSON【英文标题】:Form input values to JSON 【发布时间】:2019-06-17 05:48:34 【问题描述】:

问题

我正在尝试将表单输入转换为 json 对象,但很难实现这一点,下面是我拥有的 html 和我想要获取的 JSON 的 sn-p。


    "2019-01-23": [
        
            id: 1,
            period: 'am'
        ,
        
            id: 2,
            period: 'pm'
        
    ]
<select name="dates[2019-01-23][0][id]">
    <option value="1" selected>1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][0][period]">
    <option selected>am</option>
    <option>pm</option>
</select>

<select name="dates[2019-01-23][1][id]">
    <option value="1">1</option>
    <option value="2" selected>2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][1][period]">
    <option>am</option>
    <option selected>pm</option>
</select>

我的尝试

var inputs = $(':input').serializeArray();
var json = [];
$.each(inputs, function(key, input) 
    var names = input.name.split(/\[(.*?)\]/);
    var data = [];

    data[names[1]] = [];
    data[names[1]][names[3]] =  id: null, period: null ;
    if(names[5] == 'id') 
        data[names[1]][names[3]].id = input.value;
    
    if(names[5] == 'period') 
        data[names[1]][names[3]].period = input.value;
    

    json.push(data);
);

但这并不能完全实现我所追求的(同一日期的多个),而且我现在有点迷失了,我相信一定有一种方法可以更轻松地做到这一点。

【问题讨论】:

【参考方案1】:

首先,matchsplit 更适合您的情况。

此外,由于json 是对象字面量,它应该用空对象()初始化,而不是数组。

push 不太适合您的情况。最好使用直接赋值。

所以代码可能如下所示:

var inputs = $(':input').serializeArray();
var json = ;
$.each(inputs, function(key, input) 
    var keys = input.name.match(/([^\[\]]+)/g).slice(1);
    var date = keys[0], i = keys[1], id = keys[2];
    if (!json[date]) json[date] = [];
    if (!json[date][i]) json[date][i] = ;
    json[date][i][id] = input.value;
);
console.log(JSON.stringify(json));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<select name="dates[2019-01-23][0][id]">
    <option value="1" selected>1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][0][period]">
    <option selected>am</option>
    <option>pm</option>
</select>

<select name="dates[2019-01-23][1][id]">
    <option value="1">1</option>
    <option value="2" selected>2</option>
    <option value="3">3</option>
</select>
<select name="dates[2019-01-23][1][period]">
    <option>am</option>
    <option selected>pm</option>
</select>

【讨论】:

这几乎可以工作,但是它在方括号内返回日期,例如[2019-01-23] 而不是 2019-01-23。有什么想法吗? @Karl 抱歉,我忘记了带有g 标志的match() 返回完整匹配项,而不是捕获的组。固定。

以上是关于将输入值形成为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 将 json 绑定到表单输入

使用 PDI 元数据注入将用户定义的 JSON 输入到预期的 JSON 输出

将输入的json数据保存到数据库中

jQuery:将表单输入值设置为 json 数据

使用 PHP 将 JSON 数据放入 html 表单输入复选框

将用户输入保存在 json 文件中