JSON serializacija jQuery

Turiu serializuoti objektą JSON. Aš naudoju jQuery. Ar yra „standartinis“ būdas tai padaryti?

Mano konkreti situacija: turiu masyvą, kaip parodyta žemiau:

 var countries = new Array(); countries[0] = 'ga'; countries[1] = 'cd'; ... 

ir turiu tai paversti eilute, kad pereitumėte į $.ajax() :

 $.ajax({ type: "POST", url: "Concessions.aspx/GetConcessions", data: "{'countries':['ga','cd']}", ... 
1134
10 окт. nustatė Herb Caudill 10 okt. 2008-10-10 18:29 '08 18:29 2008-10-10 18:29
@ 11 atsakymų

JSON-js - JSON javascript.

Jei norite konvertuoti objektą į eilutę, naudokite JSON.stringify :

 var json_text = JSON.stringify(your_object, null, 2); 

Jei norite konvertuoti JSON eilutę į objektą, naudokite JSON.parse :

 var your_object = JSON.parse(json_text); 

Neseniai rekomendavo Johnas Resigas :

... PLEASE pradėkite perkelti savo programas naudodami JSON į Crockford json2.js. Tai visiškai ECMAScript 5, atitinkanti specifikacijas ir teisingai degraduoja, jei vykdoma gimtoji (greičiau!).

Tiesą sakant, vakar nuvažiavau į jQuery pokytį, kuris naudoja JSON.parse metodą, jei jis yra, dabar, kai jis buvo visiškai apibrėžtas.

Aš linkęs pasitikėti tuo, ką jis sako „JavaScript“ klausimais :)

Naujos naršyklės palaiko

1089
26 мая '09 в 22:22 2009-05-26 22:22 atsakymas pateiktas vartotojo18015 Gegužės 26 d., 09:22 2009-05-05 22:22

Aš naudoju jquery-json 6 mėnesius ir jis veikia gerai. Tai labai paprastas naudojimas:

border=0
 var myObj = {foo: "bar", "baz": "wockaflockafliz"}; $.toJSON(myObj); // Result: {"foo":"bar","baz":"wockaflockafliz"} 
181
02 июня '11 в 0:40 2011-06-02 00:40 atsakymą pateikė jay taylor, birželio 2 d. 11 d. 0:40 2011-06-02 00:40

Powered by IE8 +

Nereikia jQuery, naudokite:

 JSON.stringify(countries); 
92
29 авг. atsakymas duodamas 29 p. 2011-08-29 09:57 '11 at 9:57 2011-08-29 09:57

Aš jo nenaudojau, bet galite išbandyti Marko Gibsono parašytą jQuery įskiepį

Ji prideda dvi funkcijas: $.toJSON(value) , $.parseJSON(json_str, [safe]) .

43
10 окт. Atsakyti Tahir Akhtar 10 spalis 2008-10-10 18:35 '08 18:35 2008-10-10 18:35

Ne, standartinis JSON serializavimo būdas yra naudoti esamą JSON serializacijos biblioteką. Jei nenorite to padaryti, turėsite parašyti savo serializacijos metodus.

Jei norėtumėte, kaip tai padaryti, siūlau ištirti kai kurių turimų bibliotekų šaltinį.

EDIT: Neketinu išeiti ir pasakyti, kad savo metodų rašymas serializavimui yra blogas, tačiau reikia nepamiršti, kad jei jūsų paraiškoje svarbu naudoti gerai suformuotą JSON, tuomet turėtumėte pasverti „priklausomybę“ kad jūsų pasirinktiniai metodai gali vieną dieną susidurti su blogu atveju, kurio nesitikėjote. Ar tai yra priimtina rizika, tai yra jūsų kvietimas.

34
10 окт. Atsakymą pateikė spalio 10 d. Adam Bellaire . 2008-10-10 18:47 '08, 18:47, 2008-10-10 18:47

Radau tai kažkur. Negaliu prisiminti, kur, nors ... galbūt 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; }; 
26
02 янв. atsakymas pateikiamas jmort253 02 Jan 2011-01-02 10:57 '11 prie 10:57 2011-01-02 10:57

Jei nenorite naudoti išorinių bibliotekų, yra vietinis „JavaScript“ metodas .toSource() , tačiau tai nėra tiksliai .toSource() naršyklė.

10
02 дек. Atsakymą pateikė Kain Haart. 2009-12-02 00:44 '09 ne 0:44 2009-12-02 00:44

Geriausias būdas yra įgalinti JSON polifilavimo objektą.

Tačiau, jei primygtinai reikalaujate sukurti metodą, skirtą JSON žymėjimo objektui serializuoti ( galiojančios JSON vertės ) jQuery vardų srityje, galite tai padaryti:

Įgyvendinimas

 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); 
9
11 апр. atsakymas pateikiamas jherax balandžio 11 d 2015-04-11 08:50 '15, 8:50, 2015-04-11 08:50

Taip, prieš skambindami $ .ajax, turite JSON.stringify ir JSON.parse "Json_PostData"

$ .ajax ({ URL: post_http_site,   tipas: „POST“,  duomenys: JSON.parse (JSON.stringify (Json_PostData)),talpykla: klaidinga, klaida: funkcija (xhr, ajaxOptions, thrownError) { įspėjimas („rašyti„ Json “elementą,„ Ajax “klaida!” + xhr.status + "error =" + thrownError + "xhr.responseText =" + xhr.responseText); }, sėkmė: funkcija (duomenys) { įspėjimas („rašyti„ Json “elementą,„ Ajax OK “); }  });
7
24 марта '16 в 6:50 2016-03-24 06:50 atsakymas pateikiamas bruce'ui kovo 16 d. 16:50 2016-03-24 06:50

Tai iš esmės yra dviejų pakopų procesas:

Pirma, jums reikia atlikti šį stilių.

 var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2); 

Po to reikia konvertuoti eilutę į Objektą

 var obj = JSON.parse(JSON_VAR); 
7
29 июня '15 в 16:21 2015-06-29 16:21 atsakymą pateikė Shrish Shrivastava birželio 15 d. 15 val. 21:21 2015-06-29 16:21

Vienas dalykas, į kurį nėra atsižvelgta pirmiau minėtuose sprendimuose, yra tai, kad turite įvesties masyvą, tačiau pateikta tik viena vertė.

Pavyzdžiui, jei nugaros galas laukia daugybės žmonių, bet šiuo konkrečiu atveju jūs tiesiog dirbate su vienu asmeniu. Tada atlikite:

 <input type="hidden" name="People" value="Joe" /> 

Tada su ankstesniais sprendimais jis bus tiesiog lyginamas su kažką panašaus:

 { "People" : "Joe" } 

Bet tai tikrai turėtų pasirodyti

 { "People" : [ "Joe" ] } 

Norėdami tai ištaisyti, įvestis turėtų atrodyti taip:

 <input type="hidden" name="People[]" value="Joe" /> 

Ir naudosite šią funkciją (remdamiesi kitais sprendimais, bet šiek tiek pratęstu)

 $.fn.serializeObject = function() { var o = {}; var a = this.serializeArray(); $.each(a, function() { if (this.name.substr(-2) == "[]"){ this.name = this.name.substr(0, this.name.length - 2); o[this.name] = []; } 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; }; 
6
18 июня '14 в 18:49 2014-06-18 18:49 atsakymą pateikė Tim Burkhart , birželio 18 d. 14, 06:49 2014-06-18 18:49

Kiti klausimai, susiję su „ arba „ Klauskite“