【问题标题】:serialize form to json with numeric values将表单序列化为带有数值的 json
【发布时间】:2021-02-03 11:05:48
【问题描述】:

所以这是一个常见问题,但我还没有找到如何从表单创建 json 正文,值上没有引号但在属性中。

我想创建一个如下所示的 JSON 正文。

{
"salary1":20100,
"salary2":1000,
"bill":50000
}

但我所有的尝试都是返回带有或不带引号的属性和值,这从来都不像我需要的那样。

这就是我所拥有的

<form action="#" method="post">
    <div>
        <label for="name">Salary1</label>
        <input type="number" name="salary1" id="salary1" value=25000  data-value-type="number"  />
    </div>
    <div>
        <label for="salary2">Salary2</label>
        <input type="number" name="salary2" id="salary2" value=18200 data-value-type="number"   />
    </div>
    <div>
        <label for="Bill">Bill</label>
        <input type="number" name="bill" id="bill" value=35000  data-value-type="number"  />
    </div>
    <p>
        <input type="submit" value="Send" />
    </p>
</form>

jQuery.fn.serializeObject = function() {
  var arrayData, objectData;
  arrayData = this.serializeArray();
  objectData = {};

  $.each(arrayData, function() {
    var value;

    if (this.value != null) {
      value = this.value;
    } else {
      value = '';
    }

    if (objectData[this.name] != null) {
      if (!objectData[this.name].push) {
        objectData[this.name] = [parseFloat(objectData[this.name])];
      }

      objectData[this.name].push(parseFloat(value));
    } else {
      objectData[this.name] = value;
    }
  });

  return objectData;
};

输出

var data = $(this).serializeObject({parseNulls: true, parseNumbers: true});
    console.log("-->serializeObject",data)

返回

{ salary1: "25000", salary2: "18200", bill: "35000"}

【问题讨论】:

    标签: html jquery json forms


    【解决方案1】:

    您只是在代码的else 分支中缺少parseFloat 调用 - 没有它,它会添加始终是字符串的字段内容!

    jQuery.fn.serializeObject = function() {
      var arrayData, objectData;
      arrayData = this.serializeArray();
      objectData = {};
    
      $.each(arrayData, function() {
        var value;
    
        if (this.value != null) {
          value = this.value;
        } else {
          value = '';
        }
        
        if (objectData[this.name] != null) {
          if (!objectData[this.name].push) {
            objectData[this.name] = [parseFloat(objectData[this.name])];
          }
    
          objectData[this.name].push(parseFloat(value));
        } else {
          objectData[this.name] = parseFloat(value); // <-- Missing parseFloat was here
        }
      });
    
      return objectData;
    };
    
    $('form').submit(function(){
      var data = $(this).serializeObject({parseNulls: true, parseNumbers: true});
      console.log("-->serializeObject",data);
      return false
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <form action="#" method="post">
        <div>
            <label for="name">Salary1</label>
            <input type="number" name="salary1" id="salary1" value=25000  data-value-type="number"  />
        </div>
        <div>
            <label for="salary2">Salary2</label>
            <input type="number" name="salary2" id="salary2" value=18200 data-value-type="number"   />
        </div>
        <div>
            <label for="Bill">Bill</label>
            <input type="number" name="bill" id="bill" value=35000  data-value-type="number"  />
        </div>
        <p>
            <input type="submit" value="Send" />
        </p>
    </form>

    【讨论】:

    • 谢谢!但这太奇怪了。它在你所做的 sn-p 中看起来很完美,但我的渲染结果是这样的。将 parseFloat 添加到值时。 {salary1:25000,salary2:18200,账单:35000}
    • @Dymond 试试JSON.stringify 的结果,看看是否可行
    • @Dymond 还有你所说的“我的渲染”是什么意思?这可能只是您使用的任何东西如何表示数据。即console.log 将键包含在引号中,但其他内容可能不会(注意在创建objectData 的任何地方都没有引号)
    • 就 Javascript 而言,{foo:1} 和 {"foo":1} 是一回事。 JSON 规定只有这两个示例中的后者是有效的。
    • 哈哈,是的,我刚刚注意到 SO 控制台和 chrome 控制台显示它们的方式不同。不过我的观点是——由渲染层决定如何表示一个 javascript 对象
    猜你喜欢
    • 2016-12-08
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2016-08-14
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多