使用本机数据类型将表单输入自动编码为 JSON

Posted

技术标签:

【中文标题】使用本机数据类型将表单输入自动编码为 JSON【英文标题】:Automatically encode form input to JSON with native datatype 【发布时间】:2021-12-20 15:09:04 【问题描述】:

我知道(来自this)我可以在将值传递给JSON.stringify 之前将其显式转换为整数。但是当您想要序列化表单数据时,这种方法没有用。我有一个通用代码:

let myform='#my_form_id`;
$(myform).submit(function(event) 
    event.preventDefault();
    const formData = new FormData($(myform)[0]);
    const json = JSON.stringify(Object.fromEntries(formData));
    ws.send(json); // send over websocket
);

而且我真的不想在序列化之前手动将每个字段转换为适当的类型。这违反了“编写良好”代码的所有规则。

那么,如何在 JSON 中序列化表单字段以保持其原生数据类型?

【问题讨论】:

听起来像是地图功能的工作。您能否提供一些表单的示例 html @PoorlyWrittenCode 关键是它应该适用于 any 形式。它应该紧跟input 标签的type 值。如果 type="number" 它应该将 JSON 值作为数字,如果 type="checkbox" 作为布尔值,等等...... 【参考方案1】:

您可以map 覆盖输入并使用switch case 选择返回的数据和类型。

$('form').on('submit', function(e) 
  e.preventDefault();
  
  let json = JSON.stringify($(this).find('input').get().map(function(input)
    switch (input.type) 
      case 'checkbox':
      case 'radio': return input.checked; break;
      case 'number':
      case 'range': return +(input.value || 0); break;
      default: return input.value || ''
    
  ));
  
  $('.json').html(json);
);
<form>
  <div>
    <input>
    <input type="number">
    <input type="checkbox">
    <input type="radio">
    <input type="color">
    <input type="date">
    <input type="range">
  </div>
  <div>
    <input>
    <input type="number">
    <input type="checkbox">
    <input type="radio">
    <input type="color">
    <input type="date">
    <input type="range">
  </div>
  <button action="submit">SERIALIZE</button>
</form>
<p class="json"></p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

以上是关于使用本机数据类型将表单输入自动编码为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

此 API 不支持解析表单编码的输入

json数据重组

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

JSON编码格式提交表单数据详解

自动填充2从1个自动完成输入表单输入,以查找代码和价格

使用 JSON 数据填充表单