form表單序列化JSON
阿新 • • 發佈:2019-01-27
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方法
}