แชร์ผ่าน


การทำงานกับ JSON ใน Power Fx

Power Fx อนุญาตให้ผู้สร้างสามารถอ่าน JSON ลงใน ค่าไดนามิก โดยใช้ฟังก์ชัน ParseJSON ได้

การอ่านและการแปลงค่า

ParseJSON จะแปลงสตริงเรกคอร์ด JSON ต่อไปนี้ลงในเรกคอร์ดแบบไดนามิกที่มีเขตข้อมูล ItemNameQuantity, ReleaseDate และAvailableForPreOrder

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

สามารถเข้าถึงแต่ละเขตข้อมูลได้โดยใช้เครื่องหมายจุดบนค่าไดนามิกที่ส่งกลับจาก ParseJSON

Set( dynvalue, ParseJSON( jsonStringVariable ) );

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

โดยทั่วไปแล้วเป็นความคิดที่ดีในการแปลงค่าไดนามิกเป็นชนิดเฉพาะอย่างชัดเจน การตั้งค่าแบบไดนามิกเป็นค่าตัวแปรทําให้ตัวแปรเป็นค่าไดนามิกเช่นกัน ดังนั้น การแปลงค่าดังกล่าวอย่างชัดเจนเมื่อตั้งค่าเป็นตัวแปรจึงมีความจำเป็น แต่ในกรณีส่วนใหญ่ ค่าไดนามิกจะแปลงเป็นชนิดเฉพาะโดยอัตโนมัติ ("coerce") เมื่อใช้เป็นพารามิเตอร์ฟังก์ชันที่ชนิดเป็นชนิดอย่างง่าย เช่น บูลีน ตัวเลข หรือข้อความ และโปรไฟล์พารามิเตอร์ของฟังก์ชันไม่มีการใช้งานที่ขัดแย้งกัน

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

นอกเหนือจากการแปลงชนิดในการเรียกใช้ฟังก์ชันโดยอัตโนมัติแล้ว ค่าไดนามิกจะถูกแปลงเมื่อกําหนดให้กับคุณสมบัติตัวควบคุมถ้าเป็นไปได้

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

และสุดท้าย เมื่อใช้ ตัวดําเนินการ เช่น & หรือ +ค่าไดนามิกจะถูกบังคับถ้าไม่มีความคลุมเครือในชนิดที่คาดไว้

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

หมายเหตุ

JSON ไม่มี GUID, สี, เวลา หรือ วันที่และเวลา ประเภท ค่าเหล่านี้แสดงเป็นสตริง ถ้าคุณกําหนดค่าแบบไดนามิก JSON ที่มีวันที่ในคุณสมบัติข้อความโดยตรง ข้อความต้นฉบับของ JSON จะถูกใช้ สิ่งนี่อาจมีความสำคัญเมื่อต้องจัดการกับโซนเวลา รูปแบบวันที่ เป็นต้น ในกรณีเช่นนี้คุณควรแปลงค่าอย่างชัดเจนโดยใช้ GUID()ColorValue()DateValue()DateTimeValue() เป็นต้น

ในกรณีที่ชื่อฟิลด์ประกอบด้วยชื่อตัวระบุที่ไม่ถูกต้อง ตัวอย่างเช่น เมื่อชื่อฟิลด์เริ่มต้นด้วยตัวเลขหรือมีอักขระที่ไม่ถูกต้อง เช่น ยัติภังค์ คุณสามารถใส่ชื่อฟิลด์ในเครื่องหมายคำพูดเดี่ยว:

dynamic.'01'
dynamic.'my-field'

Power Fx จะไม่ประเมินการมีอยู่ของฟิลด์จนกว่าสูตรจะทำงาน ซึ่งช่วยให้มีความยืดหยุ่นใน JSON ขาเข้า ตัวอย่างเช่น บางครั้ง JSON ก่อนหน้าอาจมีฟิลด์พิเศษที่ชื่อ Discount แต่ในตัวอย่างก่อนหน้า ไม่มีฟิลด์นี้ การเขียนสูตรที่ใช้ฟิลด์ Discount จะไม่ทำให้เกิดข้อผิดพลาดใดๆ ระหว่างขั้นตอนการสร้างแอปหรือเมื่อผู้ใช้ใช้แอป หากฟิลด์หายไปเมื่อสูตรทำงาน ค่าดังกล่าวจะส่งผลในค่า Blank()

หมายเหตุ

JSON รองรับ null ค่าสำหรับฟิลด์ ค่าเหล่านี้ยังเป็นผลลัพธ์ในค่า Blank() ด้วย ปัจจุบันไม่มีความแตกต่างใน Power Fx ระหว่างฟิลด์ที่หายไปหรือฟิลด์ที่มีค่า null

เนื่องจากการเข้าถึงเขตข้อมูลของค่าไดนามิกจะไม่ถูกประเมินเมื่อเขียนสูตร จึงไม่มี 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' มีคอลัมน์ 'ค่า' ที่แสดงถึงค่าไดนามิก หากต้องการใช้ฟิลด์ใด ๆ จากเรกคอร์ดในตารางนี้ ให้ใช้เครื่องหมายจุดเพื่อเข้าถึงฟิลด์ JSON เฉพาะในค่า ไดนามิก ใน Value คอลัมน์

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 ที่มีคอลัมน์และค่าต่อไปนี้ทั้งหมด:

Item ปริมาณ
"วิดเจ็ต 1" 3
"วิดเจ็ต 2" 5

ตัวอย่างก่อนหน้าใช้อาร์เรย์ของเรกคอร์ด แต่ JSON ยังสามารถมีอาร์เรย์ของค่าเพียงอย่างเดียวได้ พิจารณาตัวอย่างต่อไปนี้ซึ่งเป็นสตริง JSON ที่ถูกต้องที่มีอาร์เรย์สามสตริง

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

เราสามารถดึงข้อมูลหนึ่งในรายการจากอาร์เรย์โดยใช้ฟังก์ชัน Index() และแปลงเป็นข้อความได้

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