2010-01-04 7 views
85

वेबसाइट की JSON प्रतिक्रिया का हिस्सा यह था (... संदर्भ के लिए जोड़ा गया):क्या यह JSON परिणामों में फ़ंक्शंस को परिभाषित करने के लिए मान्य है?

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

JSON को अज्ञात फ़ंक्शंस जोड़ रहा है? मैं प्रत्येक बार एक अलग मूल्य वापस करने के लिए 'समय' तक पहुंचने की उम्मीद करता हूं।

+0

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

+7

@ हर्सचवेयर - यह केवल सत्य है क्योंकि JSON जावास्क्रिप्ट से संबंधित है। एक भाषा के रूप में स्वतंत्र डेटा क्रमबद्धता प्रारूप यह झूठा है और चलने के लिए एक समस्याग्रस्त सड़क है। – jsoverson

+0

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

उत्तर

90

सं

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

प्रति http://en.wikipedia.org/wiki/JSON, "बुनियादी प्रकार" समर्थित हैं:

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

है [], {} शून्य के बराबर है? मुझे पता है कि शून्य के साथ कुछ भी तुलनीय नहीं है, लेकिन शून्य के रूप में मूल्यांकन किया गया एक खाली सेट है? –

+2

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

+0

जावास्क्रिप्ट फ़ंक्शन मानक –

7

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

3

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

4

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

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

+2

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

+0

दिलचस्प ... मैंने कभी नहीं देखा है इससे पहले। यह निश्चित रूप से नहीं है (http://www.json.org/ स्पष्ट रूप से बताता है कि जेएसओएन भाषा स्वतंत्र है, जो कार्य परिभाषाएं नहीं हैं), लेकिन फिर भी दिलचस्प है। – jvenema

+0

यह मजाकिया है कि यह भाषा स्वतंत्र होना चाहिए लेकिन जेएसओएन स्टैंड जावास्क्रिप्ट ऑब्जेक्ट नोटेशन के लिए अजीब .. –

16

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

Wikipedia JSON entry JSON में उपाय अपना सकते हैं नहीं के लिए एक अच्छा मामला बना देता है, सुरक्षा चिंताओं का हवाला देते हुए:

Unless you absolutely trust the source of the text, and you have a need to parse and accept text that is not strictly JSON compliant, you should avoid eval() and use JSON.parse() or another JSON specific parser instead. A JSON parser will recognize only JSON text and will reject other text, which could contain malevolent JavaScript. In browsers that provide native JSON support, JSON parsers are also much faster than eval. It is expected that native JSON support will be included in the next ECMAScript standard.

+1

आप जेएसओएन शब्दकोष का उपयोग कर सकते हैं, लेकिन आधिकारिक तौर पर "जेएसओएन" एक ईसीएमए मानक है जो एन्कोड किए जाने वाले कार्यों को नंगे करता है। कोई अस्पष्टता नहीं होना चाहिए ch क्षमताओं का आप जिक्र कर रहे हैं जब आप "JSON" कहते हैं - यह मानक होने का _whole point_ है। –

+0

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

7

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

जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) डाटा इंटरचेंज प्रारूप विशिष्टता राज्य:

JSON is a subset of JavaScript but excludes assignment and invocation.

Since JSON's syntax is borrowed from JavaScript, it is possible to use that language's "eval()" function to parse JSON texts. This generally constitutes an unacceptable security risk, since the text
could contain executable code along with data declarations
. The same consideration applies to the use of eval()-like functions in any other programming language in which JSON texts conform to that
language's syntax.

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

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


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

जेएस फ़ंक्शन को निष्पादन के लिए क्लाइंट-साइड ब्राउज़र में पास करने के लिए एक JSON स्ट्रिंग का उपयोग किया जा सकता है। कैसे करने के लिए "Execute JavaScript code stored as a string":

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

इस सवाल का की तरह होता है।

तैयार रहें, अपने "eval() बुराई" ध्वज को बढ़ाने के लिए तैयार रहें और इसके आगे "जेएसओएन के माध्यम से सुरंग कार्यों को सुरंग न करें" इसके आगे रखें।

-1

बंद उद्धरण छोड़ दो ...

JSON में
var a = {"b":function(){alert('hello world');} }; 

a.b(); 
-1

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

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

+0

प्रश्न है एक समारोह के बारे में एक स्ट्रिंग नहीं है। JSON स्ट्रिंग मानों का समर्थन करता है, लेकिन यह फ़ंक्शंस का समर्थन नहीं करता है। विवरण के लिए [माइक का जवाब] (https://stackoverflow.com/a/2001471/4494577) देखें – jannis

संबंधित मुद्दे

 संबंधित मुद्दे