form表单序列化JSON

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方法
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值