form表单序列化JSON

本文介绍了一种使用jQuery实现的表单数据序列化方法,包括简单属性和嵌套属性的序列化过程。提供了两种序列化函数,一种用于生成扁平化的JSON对象,另一种能生成包含嵌套结构的JSON对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简单属性的表单域,序列化后只有一层JSON对象

/**
  * 功能:序列化form表单数据成Json对象
  * 1.name均是简单的一级对象
  * 2.同名的name属性,值会被序列化为数组,例如checkbox等控件
  */
$.fn.serializeObject = function() {
    var json = {};
    var arrObj = this.serializeArray();
    $.each(arrObj, function() {
      if (json[this.name]) {
           if (!json[this.name].push) {
            json[this.name] = [ json[this.name] ];
           }
           json[this.name].push(this.value || '');
      } else {
           json[this.name] = this.value || '';
      }
    });
    return json;
};

2. 有嵌套属性的表单域,序列化成有嵌套结构的JSON对象

 /** 
 * 功能:序列化form表单元素
 * 1.同名的name属性,值会被序列化为数组,例如checkbox等控件
 * 2.可以嵌套对象,name和value会被序列化为嵌套的json对象格式
 * 3.可以嵌套对象列表,name和value会被序列化成嵌套的json数组对象
 */
 $.fn.serializeNestedObject = function() {
     var json = {};  
     var arrObj = this.serializeArray();
     //alert(JSON.stringify(arrObj));
     $.each(arrObj, function() {
          // 对重复的name属性,会将对应的众多值存储成json数组
          if (json[this.name]) {  
               if (!json[this.name].push) {
                json[this.name] = [ json[this.name] ];
               }
               json[this.name].push(this.value || '');
          } else {
               // 有嵌套的属性,用'.'分隔的
               if (this.name.indexOf('.') > -1) {
                    var pos = this.name.indexOf('.');
                    var key =  this.name.substring(0, pos);
                    // 判断此key是否已存在json数据中,不存在则新建一个对象出来
                    if(!existKeyInJSON(key, json)){
                     json[key] = {};
                    }
                    var subKey = this.name.substring(pos + 1);
                    json[key][subKey] = this.value || '';
               }
               // 普通属性
               else{
                    json[this.name] = this.value || '';
               }

          }
     });

     // 处理那些值应该属于数组的元素,即带'[number]'的key-value对
     var resultJson = {};
     for(var key in json){
          // 数组元素
          if(key.indexOf('[') > -1){
               var pos = key.indexOf('[');
               var realKey =  key.substring(0, pos);
               // 判断此key是否已存在json数据中,不存在则新建一个数组出来
               if(!existKeyInJSON(realKey, resultJson)){
                resultJson[realKey] = [];
               }
               resultJson[realKey].push(json[key]);

          }
          else{ // 单元素
               resultJson[key] = json[key];
          }
     }
     return resultJson;
 };
/**
 * 功能:判断key在Json结构中是否存在
 * 存在,返回true; 否则,返回false.
 */
 function existKeyInJSON(key, json){
      if(key == null || key == '' || $.isEmptyObject(json)){
           return false;
      }
      var exist = false;
      for(var k in json){
        if(key === k){
            exist = true;
        }
      }
      return exist;
 }

【说明】上面serializeNestedObject()方法调用了一个existKeyInJSON()方法,对简单的name属性,多个相同的name的值会序列化为数组,而复杂的name属性后面会覆盖前面的即只会有单一值
调用方式:(引入jquery库文件)

var formJson = $("#fm1").serializeObject();
$("#outDiv0").append(JSON.stringify(formJson));

var formObj = $("#fm1").serializeNestedObject();
$("#outDiv").append(JSON.stringify(formObj));

示例HTML代码:

<form id="fm1">
 <table>
 <tr><td><label>学校名称:</label> </td><td><input type="text" name="collegeName" value="软件学院"/></td></tr>
 <tr><td><label>校址:</label> </td><td><input type="text" name="location" value="滇池海梗大坝"/></td></tr>

 <!--属性中嵌套对象形式 -->
 <tr><td><label>博士编号:</label> </td><td><input type="text" name="doctor.dCode" value="DT_X0135"/></td></tr>
 <tr><td><label>教龄:</label> </td><td><input type="text" name="doctor.dAge" value="10"/></td></tr>

 <!--属性中嵌套对象形式 -->
 <tr><td><label>讲师编号:</label> </td><td><input type="text" name="teacher.name" value="TH001"/></td></tr>
 <tr><td><label>工龄:</label> </td><td><input type="text" name="teacher.workAge" value="15"/></td></tr>

 <!--属性中嵌套数组等容器形式 -->
 <tr><td><label>专业代号一:</label> </td><td><input type="text" name="profession[0].code" value="PH_SOFTWARE"/></td></tr> 
 <tr><td><label>专业名称一:</label> </td><td><input type="text" name="profession[0].content" value="软件工程"/></td></tr>
 <tr><td><label>课程一:</label> </td><td><input type="text" name="profession[0].course" value="C语言,Java编程,Linux服务编程"/></td></tr>

 <tr><td><label>专业代号二:</label> </td><td><input type="text" name="profession[1].code" value="PH_COMPUTER"/></td></tr>
 <tr><td><label>专业名称二:</label> </td><td><input type="text" name="profession[1].content" value="计算机"/></td></tr>
 <tr><td><label>课程二:</label> </td><td><input type="text" name="profession[1].course" value="汇编语言,数据结构算法,phython编程"/></td></tr>

 <tr><td><label>专业代号三:</label> </td><td><input type="text" name="profession[2].code" value="PH_TELINFORMATION"/></td></tr>
 <tr><td><label>专业名称三:</label> </td><td><input type="text" name="profession[2].content" value="电子信息"/></td></tr>
 <tr><td><label>课程三:</label> </td><td><input type="text" name="profession[2].course" value="通信原理,网络通讯"/></td></tr>

 <!-- 序列化时,同name的value会组装成数组,对应一个name -->
 <tr><td><label>学位A:</label> </td><td><input type="checkbox" checked name="degree" value="学士"/></td></tr>
 <tr><td><label>学位B:</label> </td><td><input type="checkbox" checked name="degree" value="硕士"/></td></tr>

 <!-- 会覆盖掉上面 与同name的值 -->
 <tr><td><label>课程三(覆盖属性):</label> </td><td><input type="text" name="profession[2].course" value="通信原理2,网络通讯2"/></td></tr>
 </table>

 <div style="border: 2px solid brown; height: auto;">
   <span>简单json序列化:</span><p  id="outDiv0"></p>
   <hr/>
  <span>有嵌套属性json序列化:</span><p  id="outDiv"></p>
 </div>
 </form>

后台对应的JAVA VO对象

public class College {

 // 简单属性
 private String collegeName;
 private String location;

 // 嵌套对象属性
 private Doctor doctor;
 private Teacher teacher;

 // 对象列表属性
 private List<Profession> profession;
 // 基本类型列表属性
 private List<String> degree;


 // …… get/set方法

}

//嵌套对象
class Doctor{
 private String dCode;
 private String dAge;

 // …… get/set方法
}
//嵌套对象
class Teacher{
 private String name;
 private String workAge;

 // …… get/set方法
}
//嵌套对象
class Profession{
 private String code;
 private String content;
 private String course;

 // …… get/set方法
}
<think>嗯,用户想知道如何用jQuery将HTML表单序列化JSON对象。我需要先回忆一下相关的方法。记得jQuery本身有serialize()和serializeArray()方法,但这两个生的是URL编码的字符串或者数组,不是JSON对象。用户可能需要的是直接转JSON,这样方便前端处理或者发送到后端。 这时候应该考虑是否有现的插件,比如jquery.serializeJSON,这个插件好像可以做到。需要确认插件的使用方法,比如引入脚本文件,然后调用相应的方法。比如用户提交表单时,用$('form').serializeJSON()就可以得到JSON对象。可能需要提到如何引入插件,通过CDN或者本地文件,然后基本的示例代码。 另外,用户提供的引用里有提到一些信息,比如引用1中的例子用了useIntKeysAsArrayIndex参数,可能需要解释这个参数的作用,是否处理数组索引。引用2提到引入脚本的路径,还有使用示例,可能需要给出一个完整的例子,包括HTML结构和JavaScript代码。引用3是转发的博客链接,可能里面有一些具体的步骤或者注意事项,但内容不明确,可能需要忽略或者提醒用户参考更多资料。 还要注意用户可能的常见问题,比如表单中有复选框、单选按钮如何处理,嵌套对象是否支持。插件通常会有选项配置,比如checkboxUncheckedValue,可以设置未选中的值,或者自定义数据类型解析。需要提到这些配置项,让用户知道如何扩展功能。 同时,需要确保回答的结构清晰,分步骤说明,比如先引入插件,再调用方法,处理提交事件。最后给出相关的问题,帮助用户深入理解,比如与其他序列化方法的区别,处理复杂结构,数据验证等。</think>使用jQuery将HTML表单序列化JSON对象可通过第三方插件实现,以下是具体操作步骤: ### 一、引入必要文件 在HTML中先引入jQuery和序列化插件: ```html <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery.serializejson@3.2.1/dist/jquery.serializejson.min.js"></script> ``` ### 二、基础使用方法 ```javascript $('form').submit(function(e) { e.preventDefault(); const jsonData = $(this).serializeJSON(); console.log(jsonData); // 输出示例:{name: "John", email: "john@example.com"} }); ``` ### 三、高级配置选项 1. **处理数组索引**: ```javascript $(this).serializeJSON({ useIntKeysAsArrayIndex: true // 将数字键转换为数组索引[^1] }); ``` 2. **处理复选框未选状态**: ```javascript $(this).serializeJSON({ checkboxUncheckedValue: "false" // 设置未选中时的默认值 }); ``` ### 四、嵌套对象支持 当表单控件名称包含中括号时自动创建嵌套对象: ```html <input name="user[name]"> <input name="user[address][city]"> ``` 序列化后将生: ```json { "user": { "name": "value", "address": { "city": "value" } } } ``` ### 五、数据类型解析 插件默认支持自动转换数据类型: - `parseNumbers: true` 自动转换数字 - `parseBooleans: true` 转换布尔值 - `parseNulls: true` 转换null值
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值