Debugging a huge chunk of JSON is rarely a pleasant experience. A great long string of values is not easy on the eye and rarely are they ordered in a human-friendly way. There are quite a few JSON formatters I've seen on the web, but they all appear to do the formatting on the back-end. This is my version of a JSON prettifier, written in JavaScript, which obviously does it's stuff in the browser.
For those curious to know how it works, the hard work is done by the following function. Simply call var myFormattedString = FormatJSON(myJSONObject) which recurses through your object.
function FormatJSON(oData, sIndent) {
if (arguments.length < 2) {
var sIndent = "";
}
var sIndentStyle = " ";
var sDataType = RealTypeOf(oData);
// open object
if (sDataType == "array") {
if (oData.length == 0) {
return "[]";
}
var sHTML = "[";
} else {
var iCount = 0;
$.each(oData, function() {
iCount++;
return;
});
if (iCount == 0) { // object is empty
return "{}";
}
var sHTML = "{";
}
// loop through items
var iCount = 0;
$.each(oData, function(sKey, vValue) {
if (iCount > 0) {
sHTML += ",";
}
if (sDataType == "array") {
sHTML += ("\n" + sIndent + sIndentStyle);
} else {
sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");
}
// display relevant data type
switch (RealTypeOf(vValue)) {
case "array":
case "object":
sHTML += FormatJSON(vValue, (sIndent + sIndentStyle));
break;
case "boolean":
case "number":
sHTML += vValue.toString();
break;
case "null":
sHTML += "null";
break;
case "string":
sHTML += ("\"" + vValue + "\"");
break;
default:
sHTML += ("TYPEOF: " + typeof(vValue));
}
// loop
iCount++;
});
// close object
if (sDataType == "array") {
sHTML += ("\n" + sIndent + "]");
} else {
sHTML += ("\n" + sIndent + "}");
}
// return
return sHTML;
}If you want the data sorted alphabetically first, then you need to call the following function first. It's a bit clumsy, but again, recurses through your JSON object putting your data into a more legible order.
function SortObject(oData) {
var oNewData = {};
var aSortArray = [];
// sort keys
$.each(oData, function(sKey) {
aSortArray.push(sKey);
});
aSortArray.sort(SortLowerCase);
// create new data object
$.each(aSortArray, function(i) {
if (RealTypeOf(oData[(aSortArray[i])]) == "object" ) {
oData[(aSortArray[i])] = SortObject(oData[(aSortArray[i])]);
}
oNewData[(aSortArray[i])] = oData[(aSortArray[i])];
});
return oNewData;
function SortLowerCase(a,b) {
a = a.toLowerCase();
b = b.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
}Note that both the above functions rely on my RealTypeOf method. If you're interested to see other JavaScript work I've done, check out my JAWStats web analytics project.
Useful stuff:
Code Snippets:
Recommended reading: