इसके माध्यम से साझा किया गया


JSON के साथ कार्य करना Power Fx

Power Fx निर्माताओं को एक अनटाइप्ड ऑब्जेक्ट में ParseJSON फ़ंक्शन का उपयोग करके JSON पढ़ने की अनुमति देता है.

मानों को पढ़ना और परिवर्तित करना

ParseJSON निम्न JSON रिकॉर्ड स्ट्रिंग को एक अनटाइप्ड ऑब्जेक्ट में फ़ील्ड ItemName, Quantity, ReleaseDate और AvailableForPreOrder के साथ रूपांतरित करेगा.

{
  "ItemName" : "Widget 1",
  "Quantity" : 46,
  "ReleaseDate" : "2022-09-01",
  "AvailableForPreOrder" : true
}

अनटाइप्ड ऑब्जेक्ट मान ParseJSON से लौटाए गए मान पर डॉट नोटेशन का उपयोग करके प्रत्येक फ़ील्ड तक पहुँचा जा सकता है.

Set( untyped, ParseJSON( jsonStringVariable ) );

Set( item, Text ( untyped.ItemName ) );
Set( quantity, Value ( untyped.Quantity ) );
Set( release, DateValue ( untyped.ReleaseDate ) );
Set( preorder, Boolean ( untyped.AvailableForPreOrder ) );

सामान्यतः आइडिया किसी अनटाइप्ड ऑब्जेक्ट के मान को स्पष्ट रूप से एक विशिष्ट प्रकार में परिवर्तित करने के लिए यह एक अच्छा आइडिया है। अनटाइप्ड ऑब्जेक्ट को एक चर मान के रूप में सेट करने से चर एक अनटाइप्ड ऑब्जेक्ट भी बन जाता है। इसलिए, किसी चर पर सेट करते समय ऐसे मान को स्पष्ट रूप से परिवर्तित करना आवश्यक है। लेकिन अधिकांश मामलों में अनटाइप्ड ऑब्जेक्ट मान स्वचालित रूप से एक विशिष्ट प्रकार में परिवर्तित हो जाएंगे ("coerce") जब उन्हें फ़ंक्शन पैरामीटर के रूप में उपयोग किया जाता है, जहां प्रकार बूलियन, संख्या या पाठ जैसा एक सरल प्रकार होता है, और फ़ंक्शन के पैरामीटर प्रोफ़ाइल में संभावित विरोधाभासी ओवरलोड नहीं होते हैं।

Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"

फ़ंक्शन कॉल में प्रकार को स्वचालित रूप से परिवर्तित करने के अतिरिक्त, जहां संभव हो, नियंत्रण गुणों को निर्दिष्ट करने पर अप्रकारित ऑब्जेक्ट भी परिवर्तित हो जाएंगे।

Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName

और अंत में, जब ऑपरेटरों जैसे & या + का उपयोग किया जाता है, तो अनटाइप्ड ऑब्जेक्ट को बाध्य किया जाएगा यदि अपेक्षित प्रकार पर कोई अस्पष्टता नहीं है।

untyped.Quantity + 1 // result is a number
untyped.ItemName & " (preorder)" // result is text
untyped.Quantity + untyped.Quantity // result is a number
untyped.Quantity & untyped.ItemName // result is text

नोट

JSON में GUID, रंग, समय या दिनांकसमय प्रकार नहीं है. ये मान एक स्ट्रिंग के रूप में दर्शाए जाते हैं। यदि आप दिनांक युक्त JSON अनटाइप्ड ऑब्जेक्ट मान को सीधे किसी टेक्स्ट प्रॉपर्टी में असाइन करते हैं, तो JSON का मूल टेक्स्ट उपयोग किया जाएगा। समय क्षेत्र, दिनांक प्रारूप आदि के साथ काम करते समय यह महत्वपूर्ण हो सकता है। ऐसे मामलों में आपको GUID(), ColorValue(), DateValue(), DateTimeValue(), आदि का उपयोग करके मानों को स्पष्ट रूप से परिवर्तित करना चाहिए।

यदि किसी फ़ील्ड नाम में एक अमान्य पहचानकर्ता नाम शामिल है, उदाहरण के लिए जब फ़ील्ड नाम किसी संख्या से शुरू होते हैं या हाइफ़न जैसे अमान्य वर्ण होते हैं, तो आप फ़ील्ड नामों को एकल उद्धरणों में रख सकते हैं:

untyped.'01'
untyped.'my-field'

Power Fx सूत्र के चलने तक फ़ील्ड के अस्तित्व का मूल्यांकन नहीं करेगा. यह इनकमिंग JSON में लचीलेपन की अनुमति देता है. उदाहरण के लिए, पिछले JSON कभी-कभी एक अतिरिक्त फ़ील्ड हो सकती है जिसे Discount कहा जाता है. लेकिन हमारे पिछले उदाहरण में, यह फ़ील्ड मौजूद नहीं है. ऐप बनाने की प्रक्रिया के दौरान या जब उपयोगकर्ता ऐप का उपयोग करते हैं, तो Discount फ़ील्ड का उपयोग करने वाला फ़ॉर्मूला लिखने से कोई त्रुटि नहीं होगी. यदि सूत्र चलने पर फ़ील्ड गायब है, तो मान का परिणाम केवल Blank() मान होगा.

नोट

JSON फ़ील्ड के लिए null मानों का समर्थन करता है. इनका परिणाम Blank() मान भी होगा. वर्तमान में, किसी अनुपलब्ध फ़ील्ड, या null मान वाले फ़ील्ड के बीच Power Fx में कोई अंतर नहीं है.

फ़ॉर्मूला लिखते समय अनटाइप्ड ऑब्जेक्ट्स पर एक्सेस की जाने वाली फ़ील्ड का मूल्यांकन नहीं किया जाता है, इसलिए कोई Intellisense उपलब्ध नहीं है. दोनों JSON और Power Fx केस वेदी हैं, इसलिए फ़ील्ड नाम लिखने में अतिरिक्त सावधानी बरतें.

JSON मानों का रिकॉर्ड-शैली संकेतन में होना आवश्यक नहीं है. मान्य JSON केवल एक मान हो सकता है, जैसे "text value", true या 123.456. ऐसी स्थिति में, अनटाइप्ड ऑब्जेक्ट जिसे ParseJSON रिटर्न करता है, वह ही मान है और डॉट नोटेशन का उपयोग नहीं किया जाता है.

Set( myText, Boolean( ParseJSON( "true" ) ) );

Set( myNumber, Value( ParseJSON( "123.456" ) ) );

अंत में, JSON नेस्टेड रिकॉर्ड का समर्थन करता है. इस तरह के JSON को अनटाइप्ड ऑब्जेक्ट नेस्टेड ऑब्जेक्ट्स में रूपांतरित करना, और डॉट नोटेशन का उपयोग पदानुक्रम को पार करने के लिए किया जा सकता है.

{
  "Version" : 1,
  "RootElement" : {
    "Parent" : {
      "Name" : "This is the parent",
      "Child" : {
        "Name" : "This is the child"
      }
    }
  }
}

इस JSON स्ट्रिंग को jsonObject नामक अनटाइप्ड ऑब्जेक्ट वेरिएबल में रूपांतरित करते समय, फ़ील्ड को डॉट नोटेशन का उपयोग करके एक्सेस किया जा सकता है.

Set( jsonObject, ParseJSON( jsonStringVariable ) );

Set( parentName, Text( jsonObject.RootElement.Parent.Name ) ); // "This is the parent"

Set( childName, Text( jsonObject.RootElement.Parent.Child.Name ) ); // "This is the child"

यदि डॉट नोटेशन एक्सप्रेशन में कोई भी फ़ील्ड मौजूद नहीं है, तो Blank() लौटाया जाएगा.

सरणियां और तालिकाएं

JSON में मानों या रिकॉर्ड की सरणियाँ हो सकती हैं. इन सरणियों तक सीधे पहुँचा जा सकता है, या Power Fx तालिकाओं में परिवर्तित किया जा सकता है.

{
  "OrderNumber" : "SO000010",
  "CustomerID" : "CUST0126",
  "OrderLines" : [
    {
      "Item" : "Widget 1",
      "Quantity" : 3
    },
    {
      "Item" : "Widget 2",
      "Quantity" : 5
    }
  ]
}

इस JSON में OrderLines नाम की फ़ील्ड के साथ एक रिकॉर्ड है जिसमें रिकॉर्ड्स की एक सरणी है. प्रत्येक रिकॉर्ड में दो फ़ील्ड होते हैं: Item और Quantity. यदि JSON को ParseJSON फ़ंक्शन का उपयोग करके अनटाइप्ड ऑब्जेक्ट में परिवर्तित किया जाता है फ़ंक्शन करें और jsonOrder नाम के एक वेरिएबल पर सेट किया जाता है, तो हम अलग-अलग ऑर्डर लाइन को कई तरीकों से एक्सेस कर सकते हैं.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

आप Index() फ़ंक्शन का उपयोग करके अलग-अलग रिकॉर्ड और मान पुनर्प्राप्त कर सकते हैं. उदाहरण के लिए, OrderLines फ़ील्ड में दूसरा रिकॉर्ड प्राप्त करने के लिए, फिर Quantity फ़ील्ड तक पहुंचने और इसे मान में बदलने के लिए.

Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5

आप ऑर्डर लाइनों की सरणी को सीधे तालिका में बदल सकते हैं. यह एक अनटाइप्ड ऑब्जेक्ट रिकॉर्ड का प्रतिनिधित्व करने वाली एकल-कॉलम तालिका बना देगा.

Set( orderLines, Table( jsonOrder.OrderLines ) );

एकल कॉलम तालिका 'orderLines' में अब एक 'मान' कॉलम है जो अनटाइप्ड ऑब्जेक्ट को दर्शाता है. इस तालिका में रिकॉर्ड से किसी भी फ़ील्ड का उपयोग करने के लिए, Value कॉलम में अनटाइप्ड ऑब्जेक्ट पर विशिष्ट JSON फ़ील्ड को एक्सेस करने के लिए डॉट नोटेशन का उपयोग करें.

Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table

Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"

अपने ऐप के अन्य हिस्सों में ऑर्डर लाइन रिकॉर्ड के उपयोग को आसान और अधिक सीधा बनाने के लिए, आप ForAll() फ़ंक्शन का उपयोग करके पूरे अनटाइप्ड ऑब्जेक्ट को पूरी तरह से टाइप किए गए रिकॉर्ड में बदल सकते हैं. अनटाइप्ड ऑब्जेक्ट सीधे ForAll() को प्रदान करने का अर्थ है कि आप एकल कॉलम Value फ़ील्ड का उपयोग करने के बजाय सीधे ऑब्जेक्ट फ़ील्ड तक पहुंच सकते हैं.

Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );

नया typedOrderLines वेरिएबल अब पूरी तरह से टाइप की गई Power Fx तालिका है जिसमें निम्नलिखित कॉलम और मान हैं:

आइटम मात्रा
"विज़ेट 1" 3
"विज़ेट 2" 5

पिछले उदाहरण रिकॉर्ड की सरणियों का उपयोग करते हैं, लेकिन JSON में केवल मानों की सरणियाँ भी हो सकती हैं. निम्नलिखित उदाहरण पर विचार करें जो एक मान्य JSON स्ट्रिंग है जिसमें तीन स्ट्रिंग्स की एक सरणी है.

[ "First Item", "Second Item", "Third Item"]

हम Index() फ़ंक्शन का उपयोग करके सरणी से किसी एक आइटम को पुनर्प्राप्त कर सकते हैं और इसे टेक्स्ट में बदल सकते हैं.

Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"