Jquery.serializeJSON
Serialize an HTML Form to a JavaScript Object, supporting nested attributes and arrays.
Install / Use
/learn @marioizquierdo/Jquery.serializeJSONREADME
jquery.serializeJSON
Adds the method .serializeJSON() to jQuery to serializes a form into a JavaScript Object. Supports the same format for nested parameters that is used in Ruby on Rails.
Install
Install with bower bower install jquery.serializeJSON, or npm npm install jquery-serializejson, or just download the jquery.serializejson.js script.
And make sure it is included after jQuery, for example:
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.serializejson.js"></script>
Usage Example
HTML form:
<form>
<input type="text" name="title" value="Dune"/>
<input type="text" name="author[name]" value="Frank Herbert"/>
<input type="text" name="author[period]" value="1945–1986"/>
</form>
JavaScript:
$('form').serializeJSON();
// returns =>
{
title: "Dune",
author: {
name: "Frank Herbert",
period: "1945–1986"
}
}
Nested attributes and arrays can be specified by naming fields with the syntax: name="attr[nested][nested]".
HTML form:
<form id="my-profile">
<!-- simple attribute -->
<input type="text" name="name" value="Mario" />
<!-- nested attributes -->
<input type="text" name="address[city]" value="San Francisco" />
<input type="text" name="address[state][name]" value="California" />
<input type="text" name="address[state][abbr]" value="CA" />
<!-- array -->
<input type="text" name="jobbies[]" value="code" />
<input type="text" name="jobbies[]" value="climbing" />
<!-- nested arrays, textareas, checkboxes ... -->
<textarea name="projects[0][name]">serializeJSON</textarea>
<textarea name="projects[0][language]">javascript</textarea>
<input type="hidden" name="projects[0][popular]" value="0" />
<input type="checkbox" name="projects[0][popular]" value="1" checked />
<textarea name="projects[1][name]">tinytest.js</textarea>
<textarea name="projects[1][language]">javascript</textarea>
<input type="hidden" name="projects[1][popular]" value="0" />
<input type="checkbox" name="projects[1][popular]" value="1"/>
<!-- select -->
<select name="selectOne">
<option value="paper">Paper</option>
<option value="rock" selected>Rock</option>
<option value="scissors">Scissors</option>
</select>
<!-- select multiple options, just name it as an array[] -->
<select multiple name="selectMultiple[]">
<option value="red" selected>Red</option>
<option value="blue" selected>Blue</option>
<option value="yellow">Yellow</option>
</select>
</form>
JavaScript:
$('#my-profile').serializeJSON();
// returns =>
{
fullName: "Mario",
address: {
city: "San Francisco",
state: {
name: "California",
abbr: "CA"
}
},
jobbies: ["code", "climbing"],
projects: {
'0': { name: "serializeJSON", language: "javascript", popular: "1" },
'1': { name: "tinytest.js", language: "javascript", popular: "0" }
},
selectOne: "rock",
selectMultiple: ["red", "blue"]
}
The serializeJSON function returns a JavaScript object, not a JSON String. The plugin should probably have been called serializeObject or similar, but that plugin name was already taken.
To convert into a JSON String, use the JSON.stringify method, that is available on all major new browsers.
If you need to support very old browsers, just include the json2.js polyfill (as described on stackoverfow).
var obj = $('form').serializeJSON();
var jsonString = JSON.stringify(obj);
The plugin serializes the same inputs supported by .serializeArray(), following the standard W3C rules for successful controls. In particular, the included elements cannot be disabled and must contain a name attribute. No submit button value is serialized since the form was not submitted using a button. And data from file select elements is not serialized.
Parse values with :types
Fields values are :string by default. But can be parsed with types by appending a :type suffix to the field name:
<form>
<input type="text" name="default" value=":string is default"/>
<input type="text" name="text:string" value="some text string"/>
<input type="text" name="excluded:skip" value="ignored field because of type :skip"/>
<input type="text" name="numbers[1]:number" value="1"/>
<input type="text" name="numbers[1.1]:number" value="1.1"/>
<input type="text" name="numbers[other]:number" value="other"/>
<input type="text" name="bools[true]:boolean" value="true"/>
<input type="text" name="bools[false]:boolean" value="false"/>
<input type="text" name="bools[0]:boolean" value="0"/>
<input type="text" name="nulls[null]:null" value="null"/>
<input type="text" name="nulls[other]:null" value="other"/>
<input type="text" name="arrays[empty]:array" value="[]"/>
<input type="text" name="arrays[list]:array" value="[1, 2, 3]"/>
<input type="text" name="objects[empty]:object" value="{}"/>
<input type="text" name="objects[dict]:object" value='{"my": "stuff"}'/>
</form>
$('form').serializeJSON();
// returns =>
{
"default": ":string is the default",
"text": "some text string",
// excluded:skip is ignored in the output
"numbers": {
"1": 1,
"1.1": 1.1,
"other": NaN, // <-- "other" is parsed as NaN
},
"bools": {
"true": true,
"false": false,
"0": false, // <-- "false", "null", "undefined", "", "0" are parsed as false
},
"nulls": {
"null": null, // <-- "false", "null", "undefined", "", "0" are parsed as null
"other": "other" // <-- if not null, the type is a string
},
"arrays": { // <-- uses JSON.parse
"empty": [],
"not empty": [1,2,3]
},
"objects": { // <-- uses JSON.parse
"empty": {},
"not empty": {"my": "stuff"}
}
}
Types can also be specified with the attribute data-value-type, instead of adding the :type suffix in the field name:
<form>
<input type="text" name="anumb" data-value-type="number" value="1"/>
<input type="text" name="abool" data-value-type="boolean" value="true"/>
<input type="text" name="anull" data-value-type="null" value="null"/>
<input type="text" name="anarray" data-value-type="array" value="[1, 2, 3]"/>
</form>
If your field names contain colons (e.g. name="article[my::key][active]") the last part after the colon will be confused as an invalid type. One way to avoid that is to explicitly append the type :string (e.g. name="article[my::key][active]:string"), or to use the attribute data-value-type="string". Data attributes have precedence over :type name suffixes. It is also possible to disable parsing :type suffixes with the option { disableColonTypes: true }.
Custom Types
Use the customTypes option to provide your own parsing functions. The parsing functions receive the input name as a string, and the DOM elment of the serialized input.
<form>
<input type="text" name="scary:alwaysBoo" value="not boo"/>
<input type="text" name="str:string" value="str"/>
<input type="text" name="five:number" value="5"/>
</form>
$('form').serializeJSON({
customTypes: {
alwaysBoo: (strVal, el) => {
// strVal: is the input value as a string
// el: is the dom element. $(el) would be the jQuery element
return "boo"; // value returned in the serialization of this type
},
}
});
// returns =>
{
"scary": "boo", // <-- parsed with custom type "alwaysBoo"
"str": "str",
"five": 5,
}
The provided customTypes can include one of the detaultTypes to override the default behavior:
$('form').serializeJSON({
customTypes: {
alwaysBoo: (strVal) => { return "boo"; },
string: (strVal) => { return strVal + "-OVERDRIVE"; },
}
});
// returns =>
{
"scary": "boo", // <-- parsed with custom type "alwaysBoo"
"str": "str-OVERDRIVE", // <-- parsed with custom override "string"
"five": 5, // <-- parsed with default type "number"
}
Default types used by the plugin are defined in $.serializeJSON.defaultOptions.defaultTypes.
Options
With no options, .serializeJSON() returns the same as a regular HTML form submission when serialized as Rack/Rails params. In particular:
- Values are strings (unless appending a
:typeto the input name) - Unchecked checkboxes are ignored (as defined in the W3C rules for successful controls).
- Disabled elements are ignored (W3C rules)
- Keys (input names) are always strings (nested params are objects by default)
Available options:
- checkboxUncheckedValue: string, return this value on checkboxes that are not checked. Without this option, they would be ignored. For example:
{checkboxUncheckedValue: ""}returns an empty string. If the field has a:type, the returned value will be properly parsed; for example if the field type is:boolean, it returnsfalseinstead of an empty string. - useIntKeysAsArrayIndex: true, when using integers as keys (i.e.
<input name="foods[0]" value="banana">), serialize as an array ({"foods": ["banana"]}) instead of an object ({"foods": {"0": "banana"}). - skipFalsyValuesForFields: [], s
Related Skills
openhue
335.9kControl Philips Hue lights and scenes via the OpenHue CLI.
sag
335.9kElevenLabs text-to-speech with mac-style say UX.
weather
335.9kGet current weather and forecasts via wttr.in or Open-Meteo
tweakcc
1.4kCustomize Claude Code's system prompts, create custom toolsets, input pattern highlighters, themes/thinking verbs/spinners, customize input box & user message styling, support AGENTS.md, unlock private/unreleased features, and much more. Supports both native/npm installs on all platforms.
