javascript - JQuery में JSON को क्रमबद्ध करना
ajax serialization (8)
एक बात यह है कि उपरोक्त समाधानों को ध्यान में नहीं रखा जाता है यदि आपके पास इनपुट की एक सरणी है लेकिन केवल एक मूल्य प्रदान किया गया था।
उदाहरण के लिए, यदि बैक एंड लोगों की एक सरणी की अपेक्षा करता है, लेकिन इस विशेष मामले में, आप केवल एक व्यक्ति से निपट रहे हैं। फिर कर रहे हैं:
<input type="hidden" name="People" value="Joe" />
फिर पिछले समाधानों के साथ, यह सिर्फ कुछ ऐसा करने के लिए मैप करेगा:
{
"People" : "Joe"
}
लेकिन यह वास्तव में मानचित्र करना चाहिए
{
"People" : [ "Joe" ]
}
इसे ठीक करने के लिए, इनपुट इस तरह दिखना चाहिए:
<input type="hidden" name="People[]" value="Joe" />
और आप निम्न फ़ंक्शन का उपयोग करेंगे (अन्य समाधानों के आधार पर, लेकिन थोड़ा बढ़ाया गया है)
$.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;
};
इस प्रश्न का उत्तर यहां दिया गया है:
- JSON 3 उत्तरों पर ऑब्जेक्ट को क्रमबद्ध करना
मुझे जेएसओएन को ऑब्जेक्ट को क्रमबद्ध करने की आवश्यकता है। मैं jQuery का उपयोग कर रहा हूँ। क्या ऐसा करने के लिए एक "मानक" तरीका है?
मेरी विशिष्ट स्थिति: मेरे पास नीचे दिखाए गए सरणी को परिभाषित किया गया है:
var countries = new Array();
countries[0] = 'ga';
countries[1] = 'cd';
...
और मुझे $.ajax()
इस तरह से पास करने के लिए इसे एक स्ट्रिंग में बदलने की आवश्यकता है:
$.ajax({
type: "POST",
url: "Concessions.aspx/GetConcessions",
data: "{'countries':['ga','cd']}",
...
नहीं, JSON को क्रमबद्ध करने का मानक तरीका मौजूदा JSON क्रमबद्धता लाइब्रेरी का उपयोग करना है। यदि आप ऐसा नहीं करना चाहते हैं, तो आपको अपने स्वयं के क्रमिकरण विधियों को लिखना होगा।
यदि आप इसे कैसे करें इस पर मार्गदर्शन चाहते हैं, तो मैं कुछ उपलब्ध पुस्तकालयों के स्रोत की जांच करने का सुझाव दूंगा।
संपादित करें: मैं बाहर आने वाला नहीं कहूंगा और कहूंगा कि अपनी खुद की सीरलाइजेशन विधियों को लिखना बुरा है, लेकिन आपको यह समझना चाहिए कि यदि आपके आवेदन के लिए अच्छी तरह से गठित जेएसओएन का उपयोग करना महत्वपूर्ण है, तो आपको "एक और के ऊपर का वजन करना होगा निर्भरता "इस संभावना के मुकाबले कि आपकी कस्टम पद्धति एक दिन एक विफलता मामले का सामना कर सकती है जिसे आपने अनुमान नहीं लगाया था। चाहे वह जोखिम स्वीकार्य है, आपका कॉल है।
मैं 6 महीने के लिए jquery-json का उपयोग कर रहा हूं और यह बहुत अच्छा काम करता है। इसका उपयोग करना बहुत आसान है:
var myObj = {foo: "bar", "baz": "wockaflockafliz"};
$.toJSON(myObj);
// Result: {"foo":"bar","baz":"wockaflockafliz"}
मैंने इसका उपयोग नहीं किया है लेकिन आप मार्क गिब्सन द्वारा लिखित jQuery प्लगइन को आजमा सकते हैं
यह दो कार्यों को जोड़ता है: $.toJSON(value)
, $.parseJSON(json_str, [safe])
।
यह मूल रूप से 2 कदम प्रक्रिया है:
सबसे पहले, आपको इस तरह स्ट्रिंग करने की आवश्यकता है
var JSON_VAR = JSON.stringify(OBJECT_NAME, null, 2);
उसके बाद, आपको स्ट्रिंग को ऑब्जेक्ट में कनवर्ट करने की आवश्यकता है
var obj = JSON.parse(JSON_VAR);
हां, आपको $ .Jax कॉल करने से पहले JSON.stringify और JSON.parse को "Json_PostData" करना चाहिए
$.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"); } });
JSON-js ऑब्जेक्ट के लिए पॉलीफिल को शामिल करने का सबसे अच्छा तरीका है।
लेकिन यदि आप jQuery नामस्थान के अंदर किसी ऑब्जेक्ट को JSON नोटेशन ( JSON के लिए मान्य मान ) पर क्रमबद्ध करने के लिए एक विधि बनाते हैं, तो आप ऐसा कुछ कर सकते हैं:
कार्यान्वयन
// 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));
प्रयोग
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);
JSON-js - जावास्क्रिप्ट में JSON।
ऑब्जेक्ट को स्ट्रिंग में कनवर्ट करने के लिए, JSON.stringify
उपयोग JSON.stringify
:
var json_text = JSON.stringify(your_object, null, 2);
किसी JSON स्ट्रिंग को ऑब्जेक्ट में कनवर्ट करने के लिए, JSON.parse
उपयोग JSON.parse
:
var your_object = JSON.parse(json_text);
हाल ही में जॉन रेसिग द्वारा इसकी सिफारिश की गई थी:
... कृपया अपने JSON- उपयोग अनुप्रयोगों को क्रॉकफ़ोर्ड के json2.js पर माइग्रेट करना प्रारंभ करें। यह ईसीएमएस्क्रिप्ट 5 विनिर्देश के साथ पूरी तरह से संगत है और यदि मूल (तेज़!) कार्यान्वयन मौजूद है तो यह बेहद खराब हो जाता है।
असल में, मैंने कल jQuery में एक बदलाव किया है जो JSON.parse विधि का उपयोग करता है यदि यह मौजूद है, अब यह पूरी तरह से निर्दिष्ट किया गया है।
मैं जावास्क्रिप्ट मामलों पर जो कहता हूं उस पर भरोसा करता हूं :)
नए ब्राउज़र JSON ऑब्जेक्ट को मूल रूप से समर्थन देते हैं। JSON.stringify
की JSON लाइब्रेरी का वर्तमान संस्करण केवल JSON.stringify
और JSON.parse
को परिभाषित करेगा यदि वे पहले से परिभाषित नहीं हैं, किसी भी ब्राउज़र मूल कार्यान्वयन को बरकरार रखते हैं।