javascript - Serialisering till JSON i jQuery
Jag behöver serialisera ett objekt till JSON. Jag använder jQuery. Finns det ett "standard"-sätt att göra detta?
Min specifika situation: Jag har en array definierad som visas nedan:
var countries = new Array();
countries[0] = 'ga';
countries[1] = 'cd';
...
och jag behöver omvandla detta till en sträng för att skicka till $.ajax() på detta sätt:
$.ajax({
type: "POST",
url: "Concessions.aspx/GetConcessions",
data: "{'countries':['ga','cd']}",
...
Svar #1
JSON-js - JSON i JavaScript.
För att konvertera ett objekt till en sträng, använd JSON.stringify:
var json_text = JSON.stringify(your_object, null, 2);
För att konvertera en JSON-sträng till ett objekt, använd JSON.parse:
var your_object = JSON.parse(json_text);
Det rekommenderades nyligen av John Resig:
...VÄNLIGEN börja migrera dina JSON-användande applikationer över till Crockfords json2.js. Den är helt kompatibel med ECMAScript 5-specifikationen och nedgraderar smidigt om en inbyggd (snabbare!) implementation finns.
Faktiskt, jag gjorde precis en ändring i jQuery igår som använder JSON.parse-metoden om den finns, nu när den har blivit helt specificerad.
Jag tenderar att lita på vad han säger om JavaScript-frågor :)
Alla moderna webbläsare (och många äldre som inte är urgamla) stöder JSON-objektet nativt. Den nuvarande versionen av Crockfords JSON-bibliotek kommer bara att definiera JSON.stringify och JSON.parse om de inte redan är definierade, vilket lämnar alla webbläsarens inbyggda implementationer intakta.
Svar #2
Jag har använt jquery-json i 6 månader och det fungerar utmärkt. Det är mycket enkelt att använda:
var myObj = {foo: "bar", "baz": "wockaflockafliz"};
$.toJSON(myObj);
// Result: {"foo":"bar","baz":"wockaflockafliz"}
Svar #3
Fungerar på IE8+
Ingen anledning att använda jQuery, använd:
JSON.stringify(countries);
Svar #4
Jag har inte använt det men du kanske vill prova jQuery-pluginet skrivet av Mark Gibson
Det lägger till de två funktionerna: $.toJSON(value), $.parseJSON(json_str, [safe]).
Svar #5
Nej, det standardiserade sättet att serialisera till JSON är att använda ett befintligt JSON-serialiseringsbibliotek. Om du inte vill göra det, måste du skriva dina egna serialiseringsmetoder.
Om du vill ha vägledning om hur man gör detta, föreslår jag att du undersöker källkoden för några av de tillgängliga biblioteken.
REDIGERING: Jag kommer inte att säga rakt ut att det är dåligt att skriva sina egna serialiseringsmetoder, men du måste tänka på att om det är viktigt för din applikation att använda välformad JSON, så måste du väga overheaden av "ännu ett beroende" mot möjligheten att dina egna metoder en dag kan stöta på ett fel som du inte hade förutsett. Om den risken är acceptabel är ditt beslut.
Svar #6
Jag hittade detta någonstans. Kan inte minnas var dock... förmodligen på StackOverflow :)
$.fn.serializeObject = function(){
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
Svar #7
Om du inte vill använda externa bibliotek finns det .toSource() inbyggda JavaScript-metod, men den är inte helt tvärwebbläsarkompatibel.
Svar #8
Ja, du bör JSON.stringify och JSON.parse din Json_PostData innan du anropar $.ajax:
$.ajax({
url: post_http_site,
type: "POST",
data: JSON.parse(JSON.stringify(Json_PostData)),
cache: false,
error: function (xhr, ajaxOptions, thrownError) {
alert(" write json item, Ajax error! " + xhr.status + " error =" + thrownError + " xhr.responseText = " + xhr.responseText );
},
success: function (data) {
alert("write json item, Ajax OK");
}
});
Svar #9
Det bästa sättet är att inkludera polyfillen för JSON-objektet.
Men om du insisterar på att skapa en metod för att serialisera ett objekt till JSON-notation (giltiga värden för JSON) inom jQuery-namnområdet, kan du göra något liknande detta:
Implementering
// This is a reference to JSON.stringify and provides a polyfill for old browsers.
// stringify serializes an object, array or primitive value and return it as JSON.
jQuery.stringify = (function ($) {
var _PRIMITIVE, _OPEN, _CLOSE;
if (window.JSON && typeof JSON.stringify === "function")
return JSON.stringify;
_PRIMITIVE = /string|number|boolean|null/;
_OPEN = {
object: "{",
array: "["
};
_CLOSE = {
object: "}",
array: "]"
};
//actions to execute in each iteration
function action(key, value) {
var type = $.type(value),
prop = "";
//key is not an array index
if (typeof key !== "number") {
prop = '"' + key + '":';
}
if (type === "string") {
prop += '"' + value + '"';
} else if (_PRIMITIVE.test(type)) {
prop += value;
} else if (type === "array" || type === "object") {
prop += toJson(value, type);
} else return;
this.push(prop);
}
//iterates over an object or array
function each(obj, callback, thisArg) {
for (var key in obj) {
if (obj instanceof Array) key = +key;
callback.call(thisArg, key, obj[key]);
}
}
//generates the json
function toJson(obj, type) {
var items = [];
each(obj, action, items);
return _OPEN[type] + items.join(",") + _CLOSE[type];
}
//exported function that generates the json
return function stringify(obj) {
if (!arguments.length) return "";
var type = $.type(obj);
if (_PRIMITIVE.test(type))
return (obj === null ? type : obj.toString());
//obj is array or object
return toJson(obj, type);
}
}(jQuery));
Användning
var myObject = {
"0": null,
"total-items": 10,
"undefined-prop": void(0),
sorted: true,
images: ["bg-menu.png", "bg-body.jpg", [1, 2]],
position: { //nested object literal
"x": 40,
"y": 300,
offset: [{ top: 23 }]
},
onChange: function() { return !0 },
pattern: /^bg-.+\.(?:png|jpe?g)$/i
};
var json = jQuery.stringify(myObject);
console.log(json);
Svar #10
Det är i princip en tvåstegsprocess:
Först behöver du konvertera till sträng på detta sätt:
var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2);
Efter det behöver du konvertera string till Object:
var obj = JSON.parse(JSON_VAR);
