क्या JSON परिणामों में कार्यों को परिभाषित करना मान्य है?


98

एक वेबसाइट के JSON प्रतिक्रिया का हिस्सा यह था ... (संदर्भ के लिए जोड़ा गया):

{..., now:function(){return(new Date).getTime()}, ...}

अनाम कार्यों को JSON में जोड़ना मान्य है? मैं हर बार आपसे अपेक्षा करूंगा कि आप 'समय' का उपयोग कर एक अलग मान लौटाएँ।


क्या JSON ने ब्राउज़र द्वारा सफलतापूर्वक पार्स किया? यदि हां तो यह मान्य है (उस संबंध में)।
harschware

7
@harschware - यह केवल सच है क्योंकि JSON जावास्क्रिप्ट से संबंधित है। एक भाषा स्वतंत्र डेटा क्रमांकन प्रारूप के रूप में यह गलत है और नीचे चलने के लिए एक समस्याग्रस्त सड़क है।
जॉसवर्सन

@ जॉस्वर्सन - मैं सहमत हूँ। नीचे मेरा जवाब देखें।
harschware

1
स्वयं इस प्रश्न का उत्तर देना आसान है: वेब किट निरीक्षक खोलें और चलाएं JSON.parse('{now:function(){return(new Date).getTime()}'):। इंस्पेक्टर कहता है: JSON कल्पनाUncaught SyntaxError: Unexpected token n पर एक त्वरित नज़र इसकी पुष्टि करती है। 'मान' अनुभाग पर ध्यान दें।
मार्क ई। हासे

जवाबों:


103

नहीं।

JSON विशुद्ध रूप से एक डेटा विवरण भाषा है। जैसा कि http://www.json.org पर उल्लेख किया गया है , यह "हल्का डेटा-इंटरचेंज प्रारूप" है। - प्रोग्रामिंग भाषा नहीं।

Http://en.wikipedia.org/wiki/JSON के अनुसार , "मूल प्रकार" समर्थित हैं:

  • संख्या (पूर्णांक, वास्तविक या फ़्लोटिंग पॉइंट)
  • स्ट्रिंग (बैकस्लैश भागने के साथ डबल-यूनिकोड)
  • बूलियन (सच्चा और गलत)
  • सरणी (मानों का क्रमबद्ध क्रम, अल्पविराम से अलग और वर्ग कोष्ठक में संलग्न)
  • ऑब्जेक्ट (कुंजी का संग्रह: मूल्य जोड़े, अल्पविराम से अलग और घुंघराले ब्रेसिज़ में संलग्न)
  • null

2
@Dr। Zim, नहीं और चीजों की तुलना करने के लिए मैं क्या कर रहा हूँ, यह a==null?1:a.toString()==""क्या करता है यह कहता है यदि a = null है तो यह 1 / true लौटाता है, अगर यह "" है तो रिक्त स्ट्रिंग आपको 1 / true मिलता है .. यदि यह है अशक्त या "" नहीं तो यह 0 / गलत वापस आ जाएगा, आप इसे [] और {} के साथ काम करने के लिए और अधिक कर सकते हैं, बस ?1:a==[]?1:a.toString()=={}.toString();मेरे प्रचलित स्निपेट में जोड़ दें। तो शायद यह फ़ंक्शन आपकी सहायता करेगा। isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})मैं ?1:0इसके बजाय ?true:false(सच्चे / झूठे) का उपयोग
करूँगा

10
इसी समय, फ़ंक्शन डेटा भी हैं।
argyle

2
मैं JSON का उपयोग करके "आगे के डेटा" लाने का एक रास्ता खोजने के दौरान यहां उतरा। एक ग्राहक (सर्वर से) को सूचित करना अच्छा होगा कि आगे के डेटा को कैसे प्राप्त किया जाए, ग्राहक को इस बात की चिंता किए बिना कि आरईएसटी या ऐसा एपि आगे कॉल करने के लिए।
रविन्द्रनाथ अकिला

3
@RavindranathAkila REST का तात्पर्य है कि कॉल में संभावित अगली एपीआई कॉल उजागर हो जाती हैं। दूसरे शब्दों में: आपके द्वारा किया गया REST अनुरोध, आपको बताता है कि भविष्य के कौन से अनुरोध हैं, आप करना चाहते हैं (एप्लिकेशन निर्णय तर्क और डेटा के आधार पर)। इसके लिए एक आदर्श उदाहरण जीथब एपीआई है, जहां डेटा तत्वों को वापस लौटाया जाता है - लेकिन उनमें से कुछ अन्य एपीआई अनुरोध संसाधनों को जन्म देते हैं।
जेन्स ए कोच

1
@ Jens-AndréKoch धन्यवाद! इसकी जाँच करेंगे
रविन्द्रनाथ अकिला

16

समस्या यह है कि JSON डेटा परिभाषा भाषा के रूप में JSON से जावास्क्रिप्ट ऑब्जेक्ट संकेतन के रूप में विकसित हुआ है। चूँकि जावास्क्रिप्ट JSON पर eval का समर्थन करता है, इसलिए JSON कोड को JSON (उस उपयोग-केस में) के अंदर रखना वैध है। यदि आप JSON का उपयोग दूरस्थ रूप से डेटा पास करने के लिए कर रहे हैं, तो मैं कहूंगा कि JSON में विधियां डालना बुरा है क्योंकि आपने अपने क्लाइंट-सर्वर इंटरैक्शन को अच्छी तरह से तैयार नहीं किया है। और, आगे, जब JSON को डेटा विवरण भाषा के रूप में उपयोग करने की इच्छा है, तो मैं कहूंगा कि आप एम्बेडिंग विधियों द्वारा स्वयं को परेशानी में डाल सकते हैं क्योंकि कुछ JSON पार्सर केवल डेटा विवरण को ध्यान में रखकर लिखे गए थे और संरचना में विधि परिभाषाओं का समर्थन नहीं कर सकते हैं।

विकिपीडिया JSON प्रविष्टि सुरक्षा चिंताओं का हवाला देते हुए JSON में तरीकों को शामिल नहीं करने के लिए एक अच्छा मामला बनाती है:

जब तक आप पूरी तरह से पाठ के स्रोत पर भरोसा नहीं करते हैं, और आपको पाठ को पार्स करने और स्वीकार करने की आवश्यकता है जो कड़ाई से JSON के अनुरूप नहीं है, तो आपको eval () से बचना चाहिए और इसके बजाय JSON.parse () या किसी अन्य JSON विशिष्ट पार्सर का उपयोग करना चाहिए। एक JSON पार्सर केवल JSON टेक्स्ट को पहचानेगा और अन्य टेक्स्ट को अस्वीकार कर देगा, जिसमें पुरुषवादी जावास्क्रिप्ट हो सकता है। देशी JSON समर्थन प्रदान करने वाले ब्राउज़रों में, JSON पार्सर भी eval की तुलना में बहुत तेज है। यह उम्मीद है कि देशी JSON समर्थन अगले ECMAScript मानक में शामिल किया जाएगा।


2
आप JSON बोलचाल की भाषा का उपयोग कर सकते हैं, लेकिन आधिकारिक तौर पर "JSON" एक ECMA मानक है जो ऑब्जेक्ट्स को एन्कोड करने के लिए नंगे नहीं करता है। कोई अस्पष्टता नहीं होनी चाहिए कि आप "JSON" कहते समय किन क्षमताओं का उल्लेख कर रहे हैं - यह एक मानक होने का पूरा बिंदु है।
मार्क ई। हासे

सहमत है कि आज सच है। मेरे पास हवाला देने का कोई स्रोत नहीं है, लेकिन मेरा मानना ​​है कि ECSON के जावास्क्रिप्ट गेम में आने से पहले JSON एक शब्द था, और इससे पहले JSON एक मानक डेटा विनिमय प्रारूप था ... इसलिए मैंने 'विकसित' शब्द का उपयोग किया
harschware

@harschware RFC 4627 के अनुसार, JSON को ECMA से बनाया गया था।
जेना स्लोन

9

आइए एक कल्पना की बोली - http://tools.ietf.org/html/rfc7159#section-12

जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) डाटा इंटरचेंज फ़ॉर्मेट विशिष्टता कहता है:

JSON जावास्क्रिप्ट का एक सबसेट है, लेकिन असाइनमेंट और मंगलाचरण को छोड़कर।

चूँकि JSON के सिंटैक्स को JavaScript से उधार लिया गया है, इसलिए उस भाषा के "eval ()" फ़ंक्शन का उपयोग करने के लिए JSON पाठ को पार्स करना संभव है। यह आम तौर पर अस्वीकार्य सुरक्षा जोखिम का
गठन करता है , क्योंकि पाठ में डेटा घोषणाओं के साथ निष्पादन योग्य कोड शामिल हो सकता है । यही विचार eval () के उपयोग पर लागू होता है - जैसे किसी अन्य प्रोग्रामिंग भाषा में कार्य जिसमें JSON टेक्स्ट उस
भाषा के सिंटैक्स के अनुरूप होता है ।

इसलिए सभी उत्तर जो राज्य, उस कार्य JSON मानक का हिस्सा नहीं हैं, सही हैं।

आधिकारिक उत्तर है: नहीं, JSON परिणामों में कार्यों को परिभाषित करना मान्य नहीं है!


उत्तर हां हो सकता है, क्योंकि "कोड डेटा है" और "डेटा कोड है"। यहां तक ​​कि अगर JSON का उपयोग भाषा स्वतंत्र डेटा क्रमांकन प्रारूप के रूप में किया जाता है, तो अन्य प्रकारों के माध्यम से "कोड" का एक टनलिंग काम करेगा।

निष्पादन के लिए क्लाइंट-साइड ब्राउज़र में JS फ़ंक्शन को पास करने के लिए JSON स्ट्रिंग का उपयोग किया जा सकता है।

[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]

यह प्रश्न की ओर ले जाता है: " स्ट्रिंग के रूप में संग्रहीत जावास्क्रिप्ट कोड को कैसे निष्पादित करें "।

तैयार रहें, अपना "eval () बुराई" झंडा उठाने के लिए है और अपने "JSON के माध्यम से सुरंग कार्यों को न करें" उसके बगल में झंडा लगाएँ।


7

यह मानक नहीं है जहां तक ​​मुझे पता है। Http://json.org/ पर एक त्वरित नज़र इसकी पुष्टि करती है।


4

नहीं, निश्चित रूप से नहीं।

यदि आप एक सभ्य JSON धारावाहिक का उपयोग करते हैं, तो यह आपको उस तरह के कार्य को क्रमबद्ध नहीं करने देगा। यह एक वैध उद्देश्य है, लेकिन वैध JSON नहीं है। जो भी उस वेबसाइट का इरादा है, वह वैध JSON नहीं भेज रहा है।


2
मैं JSON-Lib का उपयोग करता हूं और इसे एक महान धारावाहिक बनाने वाला मानता हूं। [उपयोग पृष्ठ] (json-lib.sourceforge.net/usage.html) से आप यह देख सकते हैं कि यह ठीक काम करेगा
harschware

दिलचस्प ... मैंने ऐसा पहले कभी नहीं देखा। यह निश्चित रूप से कल्पना नहीं है ( json.org स्पष्ट रूप से बताता है कि JSON भाषा स्वतंत्र है, जो फ़ंक्शन परिभाषाएँ नहीं हैं), लेकिन फिर भी दिलचस्प है।
jvenema

यह मज़ेदार है कि इसे भाषा स्वतंत्र माना जाता है, लेकिन JSON का अर्थ है जावास्क्रिप्ट ऑब्जेक्ट नोटिफ़िकेशन हम्म अजीब ..
Nate-Wilkins

3

JSON स्पष्ट रूप से फ़ंक्शंस को बाहर करता है क्योंकि इसका मतलब केवल जावास्क्रिप्ट डेटा संरचना होना नहीं है (नाम में जेएस के बावजूद)।


3

एक संक्षिप्त उत्तर है नहीं ...

JSON एक पाठ प्रारूप है जो पूरी तरह से भाषा स्वतंत्र है, लेकिन ऐसे सम्मेलनों का उपयोग करता है जो C, C ++, C #, जावा, जावास्क्रिप्ट, पर्ल, पायथन, और कई अन्य सहित भाषाओं के C- परिवार के प्रोग्रामर से परिचित हैं। ये गुण JSON को एक आदर्श डेटा-इंटरचेंज भाषा बनाते हैं।

कारण देखें:

किसी ब्राउज़र और सर्वर के बीच डेटा का आदान-प्रदान करते समय, डेटा केवल पाठ हो सकता है।

JSON पाठ है, और हम किसी भी जावास्क्रिप्ट ऑब्जेक्ट को JSON में बदल सकते हैं, और JSON को सर्वर पर भेज सकते हैं।

हम सर्वर से प्राप्त किसी JSON को जावास्क्रिप्ट ऑब्जेक्ट में भी बदल सकते हैं।

इस तरह हम डेटा को जावास्क्रिप्ट ऑब्जेक्ट के रूप में काम कर सकते हैं, जिसमें कोई जटिल पार्सिंग और अनुवाद नहीं है।

लेकिन रुकिए ...

आपके फ़ंक्शन को संग्रहीत करने के तरीके अभी भी हैं, यह व्यापक रूप से उस पर अनुशंसित नहीं है, लेकिन अभी भी संभव है:

हमने कहा, आप एक string... कैसे अपने कार्य को एक स्ट्रिंग में परिवर्तित करने के बारे में बचा सकते हैं ?

const data = {func: '()=>"a FUNC"'};

तब आप डेटा का उपयोग करके JSON.stringify(data)और उसके बाद JSON.parseउसे पार्स करने के लिए उपयोग कर सकते हैं (यदि यह कदम आवश्यक है) ...

और एक स्ट्रिंग फ़ंक्शन निष्पादित करने के लिए eval (ऐसा करने से पहले, बस आपको व्यापक रूप से अनुशंसित नहीं eval का उपयोग करने की जानकारी दें):

eval(data.func)(); //return "a FUNC"

0

NodeJS (commonJS सिंटैक्स) का उपयोग करने के माध्यम से मैं इस प्रकार की कार्यक्षमता प्राप्त करने में सक्षम था, मेरे पास मूल रूप से कुछ जेएस फाइल के अंदर एक JSON संरचना थी, लेकिन मैं चाहता था कि यह संरचना एक वर्ग से अधिक हो, जिस तरीके से निर्णय लिया जा सकता है। भागो समय

MyJSON में 'एक्जिक्यूटर' की घोषणा की आवश्यकता नहीं है।

var myJSON = {
    "Hello": "World",
    "Executor": ""
}

module.exports = {
    init: () => { return { ...myJSON, "Executor": (first, last) => { return first + last } } }
}

-3

JSON में फ़ंक्शन अभिव्यक्तियाँ पूरी तरह से संभव हैं, बस इसे दोहरे उद्धरण चिह्नों में लपेटना न भूलें। यहाँ एक उदाहरण noSQL डेटाबेस डिजाइन से लिया गया है:

{
  "_id": "_design/testdb",
  "views": {
    "byName": {
      "map": "function(doc){if(doc.name){emit(doc.name,doc.code)}}"
    }
  }
}


सवाल एक फंक्शन का नहीं एक स्ट्रिंग का है। JSON स्ट्रिंग मानों का समर्थन करता है, लेकिन यह फ़ंक्शन का समर्थन नहीं करता है। देखें माइक जवाब जानकारी के लिए
Jannis

@ जॉनी हालांकि इसकी संभव है। यदि आप एक स्वयं को जोड़ने समारोह की तरह। यहाँ लोगों को स्पष्ट रूप से सिर्फ जवाब पता नहीं है।
रोज

-4

हालाँकि, यह काम नहीं करता है:

<!DOCTYPE html>
<html>
<body>

<h2>Convert a string written in JSON format, into a JavaScript function.</h2>

<p id="demo"></p>

<script>
    function test(val){return val + " it's OK;}
    var someVar = "yup";
    var myObj = { "func": "test(someVar);" };
    document.getElementById("demo").innerHTML = eval(myObj.func);
</script>

</body>
</html>

1
उदाहरण के लिए HTML का उपयोग करने के लिए इसका उपयोग नहीं किया जाता है, क्योंकि यह 5 साल पुरानी कोडिंग शैली है, एक लापता उद्धरण है, और, JSON फ़ाइलों को फ़ंक्शन शामिल करने की आवश्यकता नहीं है, अगर वे सीरियल किए नहीं जा सकते हैं, या संग्रहीत नहीं किए जा सकते हैं नो एसक्यूएल डीबी,
मार्टिज़न शेफ़र

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.