मान अभिव्यक्ति (Value Expressions)

अंतिम अपडेट: 20 जुलाई 2026

Script में जहाँ भी कोई मान आवश्यक होता है (URL, request body, field मान, शर्त, filter मान, target id आदि), वह नीचे दिए तीन रूपों में से एक होता है। यह दस्तावेज़ उन तीन रूपों को, मान कहाँ से आते हैं (context रूट), और WEEGLOO डेटा के लिए विशिष्ट locale map नियमों को समझाता है। Statement कैटलॉग के सभी fields इस नियम का पालन करते हैं।

तीन रूप

रूपनियमउदाहरण
संदर्भ (reference)किसी string के भीतर के { /json-pointer } को context के सापेक्ष resolve करता है।"{ /payload/fields/title }"
लिटरल (literal){ /ptr } रहित मान (string, संख्या, बूलियन, ऑब्जेक्ट, array)। इसे ज्यों-का-त्यों उपयोग किया जाता है।"draft", 42, true, { "a": 1 }
संक्रिया और शर्त (JsonLogic)एक ऑब्जेक्ट जिसकी एकमात्र key एक ऑपरेटर होती है। इसके ऑपरेंड फिर से मान अभिव्यक्ति होते हैं (संदर्भ, लिटरल, नेस्टेड संक्रिया)।{ "+": [ "{ /vars/n }", 1 ] }

तीनों रूप नेस्ट होते हैं। JsonLogic के ऑपरेंड में एक संदर्भ रखकर, फिर उस संदर्भ के परिणाम को किसी अन्य संक्रिया में डालकर इन्हें संयोजित किया जाता है।

संदर्भ: { /json-pointer }

ब्रेसेस { } के भीतर एक RFC 6901 JSON Pointer (जो अनिवार्यतः / से शुरू होता है) रखें। ब्रेसेस के आस-पास का space मान्य है ({ /a/b }, {/a/b} के समान है)।

एकल पॉइंटर बनाम मिश्रित टेम्प्लेट: टाइप नियम

  • जब पूरी string एक ही पॉइंटर हो, तो मान अपना मूल टाइप बनाए रखता है (संख्या हो तो संख्या, ऑब्जेक्ट हो तो ऑब्जेक्ट, array हो तो array)।
  • जब यह लिटरल टेक्स्ट के साथ मिश्रित हो, तो परिणाम string संयोजन (concatenation) होता है।
"{ /payload/fields/count }"                 // संख्या हो तो संख्या ज्यों-की-त्यों (उदा. 42)
"{ /payload/fields/tags }"                  // array हो तो array ज्यों-का-त्यों
"page-{ /payload/fields/n }-of-10"          // string संयोजन → "page-42-of-10"
"Bearer { /payload/fields/token }"          // string संयोजन → "Bearer abc123"

अनुपस्थित मान और एस्केप

  • जब path अनुपस्थित हो या मान खाली हो, तो एकल पॉइंटर null और मिश्रित टेम्प्लेट खाली string के रूप में संसाधित होता है।
  • { को लिटरल के रूप में उपयोग करने के लिए इसे \{ से एस्केप करें (उस स्थान को पॉइंटर के रूप में नहीं समझा जाता)।

Context रूट: मान कहाँ से आते हैं

{ /pointer } का शीर्ष-स्तरीय segment नीचे दिए पाँच में से एक होता है।

रूटसामग्री
/payloadcall के समय पास किया गया JSON payload (input)। उदाहरण: { /payload/fields/email }
/headerscall के समय पास किए गए request HTTP हेडर। keys लोअरकेस होती हैं और प्रति नाम एकल मान होता है। उदाहरण: { /headers/authorization }
/<name>उस name को धारण करने वाले पूर्ववर्ती statement का परिणाम। उदाहरण: { /order/sys/id }
/vars/<name>SetVar से घोषित एक script-scoped परिवर्तनीय वेरिएबल। उदाहरण: { /vars/total }
/errorकेवल Try के catch block के भीतर उपयोग होता है। पकड़ी गई त्रुटि { message, statement }। उदाहरण: { /error/message }

statement परिणाम का आकार

name धारण करने वाले statement के परिणाम का आकार टाइप के अनुसार भिन्न होता है।

statementपरिणाम आकारसंदर्भ उदाहरण
Http{ status, body }{ /resp/status }, { /resp/body/choices/0/message/content }
ResourceCreate, ResourceRead(एकल), ResourceFind(एकल)रिसोर्स स्वयं{ /post/sys/id }, { /post/fields/title/en-US }
ResourcePageRead{ items, next }{ /page/items/0/sys/id }, { /page/next }
  • ResourceFind कोई मैच न होने पर null bind करता है। अस्तित्व के आधार पर शाखा बनाने के लिए { "==": [ "{ /found }", null ] } का उपयोग करें।
  • ResourceRead(एकल) में target न होने पर यह त्रुटि है (Try से संभाला जा सकता है)। विस्तृत जानकारी Statement कैटलॉग का रिसोर्स पठन में दी गई है।

संक्रिया और शर्त: JsonLogic

जब कोई गणना या शर्त आवश्यक हो, तो jsonlogic.com spec के ऑपरेटर ऑब्जेक्ट का उपयोग करें।

  • डेटा एक्सेस को vanilla var (dot-path) से नहीं, बल्कि { /ptr } संदर्भ पर मानकीकृत किया गया है। इंजन पहले ऑपरेंड के पॉइंटर को resolve करता है, फिर ऑपरेटर लागू करता है।
  • जब किसी एकल-key ऑब्जेक्ट की key एक पंजीकृत ऑपरेटर हो, तो इसे एक संक्रिया के रूप में, अन्यथा एक सामान्य ऑब्जेक्ट के रूप में समझा जाता है।

ऑपरेटर तालिका

श्रेणीऑपरेटरअर्थ और उदाहरण
शर्तif (उपनाम ?:){ "if": [शर्त, सत्य मान, शर्त2, सत्य मान2, …, डिफ़ॉल्ट मान] }. पहली सत्य शर्त का मान, न हो तो अंतिम डिफ़ॉल्ट मान।
तर्कand, orशॉर्ट-सर्किट मूल्यांकन। and पहला falsy (या अंतिम), or पहला truthy (या अंतिम) ऑपरेंड मान के रूप में लौटाता है।
तर्क! (not), !! (to-bool){ "!": x } truthy का निषेध करता है, { "!!": x } truthy होना बताता है। अस्तित्व जाँच के लिए !! अक्सर उपयोग होता है।
समानता==, !=ढीली तुलना (संख्या में रूपांतरण के बाद तुलना; "1"==1 सत्य है)।
समानता===, !==सख्त तुलना (टाइप सहित)।
तुलना<, <=, >, >=शृंखलाबद्ध: { "<": [1,2,3] } का अर्थ 1<2 AND 2<3 है। संख्या में परिवर्तित न हो सके (NaN) तो false।
अंकगणित+सभी ऑपरेंड का योग।
अंकगणित-एक ऑपरेंड हो तो ऋणात्मक बनाना, दो हों तो घटाव।
अंकगणित*, /, %गुणा, भाग, शेष।
समुच्चयनmin, maxऑपरेंड में से न्यूनतम, अधिकतम।
स्ट्रिंगcatसभी ऑपरेंड को string के रूप में जोड़ना।
समावेशin{ "in": [needle, haystack] }. haystack यदि string हो तो सबस्ट्रिंग, collection हो तो तत्व समावेश।
arraymergeकई array या मानों को एक ही array में समतल करना (संचय के लिए उपयोग)।

array पर पुनरावृत्ति करने वाले ऑपरेटर (map, filter, reduce, all, some, none) समर्थित नहीं हैं। Script किसी array पर Loop से पुनरावृत्ति करता है (Statement कैटलॉग का Loop)।

संख्या रूपांतरण और उदाहरण

संख्या रूपांतरण के नियम इस प्रकार हैं। संख्या को ज्यों-का-त्यों रखा जाता है, true को 1, false को 0 में बदला जाता है, string को पार्स किया जाता है (पार्स न हो सके तो गणना विफलता मान), और null को 0 में बदला जाता है।

{ "-":  [ "{ /wallet/fields/balance/en-US }", "{ /payload/fields/cost }" ] }   // बैलेंस - लागत
{ "<":  [ "{ /wallet/fields/balance/en-US }", "{ /payload/fields/cost }" ] }   // बैलेंस < लागत → boolean
{ "and": [ { "<": [ "{ /a/body/risk }", 0.5 ] }, { ">=": [ "{ /b/body/score }", 700 ] } ] }
{ "cat": [ "id-", "{ /payload/sys/id }" ] }                                    // "id-<uuid>"
{ "!!": "{ /found/sys/id }" }                                                  // मौजूद हो तो true
{ "merge": [ "{ /vars/ids }", [ "{ /row/sys/id }" ] ] }                        // array में एक तत्व संचित
{ "if": [ "{ /page/next }", "{ /page/next }", "END" ] }                        // next हो तो next, न हो तो "END"

सत्य और असत्य का निर्धारण (Truthiness)

if, and, or, !, !! तथा If.condition, Loop.while नीचे दिए नियमों से सत्य और असत्य तय करते हैं।

  • falsy: null, false, संख्या 0, खाली string "", खाली collection (खाली array)।
  • truthy: बाकी सब कुछ (0 से भिन्न संख्या, गैर-खाली string और array, हर ऑब्जेक्ट)।

keys भी संदर्भ हो सकती हैं

fields जैसे map की keys भी { /ptr } संदर्भ का समर्थन करती हैं। key runtime पर resolve होती है।

"fields": { "{ /payload/fields/fieldName }": { "en-US": "{ /payload/fields/fieldValue }" } }

यदि दो keys एक ही मान में resolve होती हैं, तो टकराव होता है और यह इंजन त्रुटि है।

locale map (LocaleValueMap): Content और Media के लिए विशिष्ट नियम

WEEGLOO के Content और Media का प्रत्येक field एक मान नहीं, बल्कि locale-वार map होता है (उदाहरण: balance जो { "en-US": 1, "ko-KR": 10 } है)। इसलिए पढ़ते और लिखते समय locale को साथ में संभालना पड़ता है। Media में भी title और description (स्केलर), तथा file (ingest निर्देश) locale map हैं। /payload या HTTP प्रतिक्रिया जैसे, जो Content या Media नहीं हैं, ऐसे JSON इस नियम से असंबद्ध हैं (वे schema द्वारा निर्धारित संरचना जैसे-के-वैसे रहते हैं, और स्केलर हो तो स्केलर रहते हैं)।

पठन

  • स्केलर पाने के लिए locale तक निर्दिष्ट करें: { /<name>/fields/<field>/<locale> } (उदाहरण: { /post/fields/title/en-US })।
  • locale के बिना { /<name>/fields/<field> } देने पर पूरा locale map ऑब्जेक्ट लौटता है।
  • localized:false field केवल डिफ़ॉल्ट locale बकेट में होता है, इसलिए उसे उस डिफ़ॉल्ट locale कोड से पढ़ें।

लेखन (ResourceCreate, ResourceUpdate, ResourcePatch के fields)

मान एक locale map { "<locale>": <स्केलर मान अभिव्यक्ति> } होता है। यह पठन के सममित है।

"fields": {
  "title":  { "en-US": "Hello", "ko-KR": "안녕" },   // कई locales के लिए बकेट सूचीबद्ध
  "status": { "en-US": "paid" }
}
  • ResourceCreate populate किए जाने वाले हर field में space की डिफ़ॉल्ट locale बकेट अनिवार्यतः शामिल करनी चाहिए (default-locale नियम)।
  • ResourceUpdate संपूर्ण प्रतिस्थापन हैfields में अनुपस्थित fields और locales हटा दिए जाते हैं (file सहित)।
  • ResourcePatch केवल निर्दिष्ट fields और बकेट को ही अपडेट करता है (बाकी fields और locales बनाए रखे जाते हैं)।
  • लिटरल null से हटाएं: यदि मान लिटरल null है, तो वह (field, locale) बकेट हटा दी जाती है (Patch में किसी विशिष्ट locale को खाली करने का मानक तरीका)। "" (खाली string) हटाना नहीं, बल्कि खाली मान सेट करना है। यदि कोई मान अभिव्यक्ति ({ /ptr }) runtime पर null में मूल्यांकित होती है, तो यह हटाना नहीं, बल्कि त्रुटि है (payload की अनुपस्थिति को चुपचाप नहीं निगला जाता)। हटाना केवल लिटरल null पर ही लागू होता है।
  • Media का file: मान स्केलर नहीं, बल्कि एक ingest निर्देश { "source": …, "encoding": "url"|"base64" } है। file वाला लेखन केवल Async है (Statement कैटलॉग का ResourceCreate)।
  • localized:false field को केवल डिफ़ॉल्ट locale बकेट में डालें।
  • locale कोड (map की key) भी { /ptr } संदर्भ हो सकता है (ऊपर keys भी संदर्भ हो सकती हैं देखें)। गतिशील locale बनाते समय इसका उपयोग करें।

locale सुविधा field

ResourceCreate, ResourceUpdate, ResourcePatch को locale देने पर, इंजन fields के प्रत्येक मान को स्वतः { <locale>: मान } बकेट में लपेट देता है। अर्थात् केवल स्केलर देना पर्याप्त है।

// नीचे दिए दोनों समान हैं
{ "type": "ResourceCreate", "resource": "Content", "contentType": { "sys": { "id": "ct_post" } },
  "locale": "en-US", "fields": { "title": "Hello" } }
 
{ "type": "ResourceCreate", "resource": "Content", "contentType": { "sys": { "id": "ct_post" } },
  "fields": { "title": { "en-US": "Hello" } } }

locale देते हुए यदि मान में पहले से एक locale map ({ "en-US": … }) नेस्ट किया गया हो, तो यह { <locale>: { "en-US": … } } की तरह दोहरा नेस्ट हो जाता है (लेखक की गलती)। एक ही शैली पर टिके रहें: locale का उपयोग करें तो केवल स्केलर, न करें तो केवल स्पष्ट locale map।

where और order की locale

  • where और order में fields.X पर इंजन space की डिफ़ॉल्ट locale स्वतः लागू करता है (CMA क्वेरी के समान)।
  • किसी विशिष्ट locale को लक्षित करने के लिए fields.X.<locale> के रूप में स्पष्ट करें।
"where": { "fields.slug": { "eq": "{ /payload/fields/slug }" } }   // डिफ़ॉल्ट locale slug
"where": { "fields.title.ko-KR": { "prefix": "안" } }              // विशिष्ट locale