var JsonUti = {
// 定義換行符
n: "\n",
// 定義制表符
t: "\t",
// 轉換String
convertToString: function (obj) {
return JsonUti.__writeObj(obj, 1);
},
// 寫對象
__writeObj: function (obj // 對象
, level // 層次(基數為1)
, isInArray) { // 此對象是否在一個集合內
// 如果為空,直接輸出null
if (obj == null) {
return "null";
}
// 為普通類型,直接輸出值
if (obj.constructor == Number || obj.constructor == Date || obj.constructor == String || obj.constructor == Boolean) {
var v = obj.toString();
var tab = isInArray ? JsonUti.__repeatStr(JsonUti.t, level - 1) : "";
if (obj.constructor == String || obj.constructor == Date) {
// 時間格式化只是單純輸出字符串,而不是Date對象
return tab + ("\"" + v + "\"");
}
else if (obj.constructor == Boolean) {
return tab + v.toLowerCase();
}
else {
return tab + (v);
}
}
// 寫Json對象,緩存字符串
var currentObjStrings = [];
// 遍歷屬性
for ( var name in obj) {
var temp = [];
// 格式化Tab
var paddingTab = JsonUti.__repeatStr(JsonUti.t, level);
temp.push(paddingTab);
// 寫出屬性名
temp.push(name + " : ");
var val = obj[name];
if (val == null) {
temp.push("null");
}
else {
var c = val.constructor;
if (c == Array) { // 如果為集合,循環內部對象
temp.push(JsonUti.n + paddingTab + "[" + JsonUti.n);
var levelUp = level + 2; // 層級+2
var tempArrValue = []; // 集合元素相關字符串緩存片段
for ( var i = 0; i < val.length; i++) {
// 遞歸寫對象
tempArrValue.push(JsonUti.__writeObj(val[i], levelUp, true));
}
temp.push(tempArrValue.join("," + JsonUti.n));
temp.push(JsonUti.n + paddingTab + "]");
}
else if (c == Function) {
temp.push("[Function]");
}
else {
// 遞歸寫對象
temp.push(JsonUti.__writeObj(val, level + 1));
}
}
// 加入當前對象“屬性”字符串
currentObjStrings.push(temp.join(""));
}
return (level > 1 && !isInArray ? JsonUti.n : "") // 如果Json對象是內部,就要換行格式化
+ JsonUti.__repeatStr(JsonUti.t, level - 1) + "{" + JsonUti.n // 加層次Tab格式化
+ currentObjStrings.join("," + JsonUti.n) // 串聯所有屬性值
+ JsonUti.n + JsonUti.__repeatStr(JsonUti.t, level - 1) + "}"; // 封閉對象
},
__isArray: function (obj) {
if (obj) {
return obj.constructor == Array;
}
return false;
},
__repeatStr: function (str, times) {
var newStr = [];
if (times > 0) {
for ( var i = 0; i < times; i++) {
newStr.push(str);
}
}
return newStr.join("");
}
};
// 定義換行符
n: "\n",
// 定義制表符
t: "\t",
// 轉換String
convertToString: function (obj) {
return JsonUti.__writeObj(obj, 1);
},
// 寫對象
__writeObj: function (obj // 對象
, level // 層次(基數為1)
, isInArray) { // 此對象是否在一個集合內
// 如果為空,直接輸出null
if (obj == null) {
return "null";
}
// 為普通類型,直接輸出值
if (obj.constructor == Number || obj.constructor == Date || obj.constructor == String || obj.constructor == Boolean) {
var v = obj.toString();
var tab = isInArray ? JsonUti.__repeatStr(JsonUti.t, level - 1) : "";
if (obj.constructor == String || obj.constructor == Date) {
// 時間格式化只是單純輸出字符串,而不是Date對象
return tab + ("\"" + v + "\"");
}
else if (obj.constructor == Boolean) {
return tab + v.toLowerCase();
}
else {
return tab + (v);
}
}
// 寫Json對象,緩存字符串
var currentObjStrings = [];
// 遍歷屬性
for ( var name in obj) {
var temp = [];
// 格式化Tab
var paddingTab = JsonUti.__repeatStr(JsonUti.t, level);
temp.push(paddingTab);
// 寫出屬性名
temp.push(name + " : ");
var val = obj[name];
if (val == null) {
temp.push("null");
}
else {
var c = val.constructor;
if (c == Array) { // 如果為集合,循環內部對象
temp.push(JsonUti.n + paddingTab + "[" + JsonUti.n);
var levelUp = level + 2; // 層級+2
var tempArrValue = []; // 集合元素相關字符串緩存片段
for ( var i = 0; i < val.length; i++) {
// 遞歸寫對象
tempArrValue.push(JsonUti.__writeObj(val[i], levelUp, true));
}
temp.push(tempArrValue.join("," + JsonUti.n));
temp.push(JsonUti.n + paddingTab + "]");
}
else if (c == Function) {
temp.push("[Function]");
}
else {
// 遞歸寫對象
temp.push(JsonUti.__writeObj(val, level + 1));
}
}
// 加入當前對象“屬性”字符串
currentObjStrings.push(temp.join(""));
}
return (level > 1 && !isInArray ? JsonUti.n : "") // 如果Json對象是內部,就要換行格式化
+ JsonUti.__repeatStr(JsonUti.t, level - 1) + "{" + JsonUti.n // 加層次Tab格式化
+ currentObjStrings.join("," + JsonUti.n) // 串聯所有屬性值
+ JsonUti.n + JsonUti.__repeatStr(JsonUti.t, level - 1) + "}"; // 封閉對象
},
__isArray: function (obj) {
if (obj) {
return obj.constructor == Array;
}
return false;
},
__repeatStr: function (str, times) {
var newStr = [];
if (times > 0) {
for ( var i = 0; i < times; i++) {
newStr.push(str);
}
}
return newStr.join("");
}
};
使用:alert(JsonUti.convertToString(data)); data為json對象。