Skip to content

Instantly share code, notes, and snippets.

@chicagoworks
Created December 24, 2010 19:05
Show Gist options
  • Star 45 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
  • Save chicagoworks/754454 to your computer and use it in GitHub Desktop.
Save chicagoworks/754454 to your computer and use it in GitHub Desktop.
jQuery.stringify() utility
/**
* converted stringify() to jQuery plugin.
* serializes a simple object to a JSON formatted string.
* Note: stringify() is different from jQuery.serialize() which URLEncodes form elements
* UPDATES:
* Added a fix to skip over Object.prototype members added by the prototype.js library
* USAGE:
* jQuery.ajax({
* data : {serialized_object : jQuery.stringify (JSON_Object)},
* success : function (data) {
*
* }
* });
*
* CREDITS: http://blogs.sitepointstatic.com/examples/tech/json-serialization/json-serialization.js
*/
jQuery.extend({
stringify : function stringify(obj) {
var t = typeof (obj);
if (t != "object" || obj === null) {
// simple data type
if (t == "string") obj = '"' + obj + '"';
return String(obj);
} else {
// recurse array or object
var n, v, json = [], arr = (obj && obj.constructor == Array);
for (n in obj) {
v = obj[n];
t = typeof(v);
if (obj.hasOwnProperty(n)) {
if (t == "string") v = '"' + v + '"'; else if (t == "object" && v !== null) v = jQuery.stringify(v);
json.push((arr ? "" : '"' + n + '":') + String(v));
}
}
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
}
}
});
@pedrochaves
Copy link

Hint:
You could optimize this method to use the native JSON.stringify method, so that your recursive method would only be executed on IE6/7, like this:
This way, your code would only be executed on older browsers, working as a fallback :)

jQuery.extend({
    stringify  : function stringify(obj) {         
        if ("JSON" in window) {
            return JSON.stringify(obj);
        }

        var t = typeof (obj);
        if (t != "object" || obj === null) {
            // simple data type
            if (t == "string") obj = '"' + obj + '"';

            return String(obj);
        } else {
            // recurse array or object
            var n, v, json = [], arr = (obj && obj.constructor == Array);

            for (n in obj) {
                v = obj[n];
                t = typeof(v);
                if (obj.hasOwnProperty(n)) {
                    if (t == "string") {
                        v = '"' + v + '"';
                    } else if (t == "object" && v !== null){
                        v = jQuery.stringify(v);
                    }

                    json.push((arr ? "" : '"' + n + '":') + String(v));
                }
            }

            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
    }
});

@Braunson
Copy link

Thanks, to both of you! Super handy!

Copy link

ghost commented Oct 3, 2012

I'm about to use this.. RIGHT NOW! :D THANKS!

@sanfilippopablo
Copy link

Good.

@mcgarciabr
Copy link

Thanks both of you !!! Very good help.

@porub
Copy link

porub commented Jan 22, 2013

Doesn't escape double qoutes (") :(((.

So JSON.stringify( { Password: 'ab"c' } ) produces good JSON string: '{"Password":"ab"c"},
but the jQuery.stringify( { Password: 'ab"c' } ) in IE6-7 or in IE8+ compatibility mode leads to a broken unescaped string: '{"Password":"ab"c"}'

see also: http://code.google.com/p/jquery-json/source/browse/trunk/src/jquery.json.js

@borgle
Copy link

borgle commented Aug 21, 2015

escape double qoutes. :)))

jQuery.extend({
    stringify  : function stringify(obj) {         
        if ("JSON" in window) {
            return JSON.stringify(obj);
        }

        var t = typeof (obj);
        if (t != "object" || obj === null) {
            // simple data type
            if (t == "string") obj = '"' + obj.replace(/"/g,'\\\"') + '"';
            return String(obj);
        } else {
            // recurse array or object
            var n, v, json = [], arr = (obj && obj.constructor == Array);

            for (n in obj) {
                v = obj[n];
                t = typeof(v);
                if (obj.hasOwnProperty(n)) {
                    if (t == "string") {
                        v = '"' + v.replace(/"/g,'\\\"') + '"';
                    } else if (t == "object" && v !== null){
                        v = jQuery.stringify(v);
                    }
                    json.push((arr ? "" : '"' + n + '":') + String(v));
                }
            }

            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
    }
});

@tokkonopapa
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment