1. 程式人生 > >form表單序列化JSON

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方法
}