Bagikan melalui


Bekerja dengan JSON di Power Fx

Power Fx mengizinkan pembuat untuk membaca JSON ke dalam Objek yang tidak diketik menggunakan fungsi ParseJSON.

Membaca dan mengubah nilai

ParseJSON akan mengonversi string catatan JSON berikut menjadi objek tidak bertipe dengan bidang ItemName, Quantity,dan ReleaseDate AvailableForPreOrder.

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

Setiap bidang dapat diakses menggunakan notasi titik pada nilai Objek yang tidak diketik yang dikembalikan dari 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 ) );

Umumnya merupakan ide yang baik untuk secara eksplisit mengonversi nilai objek tidak bertipe ke jenis tertentu. Mengatur objek tidak bertipe sebagai nilai variabel membuat variabel menjadi objek tidak bertipe juga. Jadi, mengonversi nilai tersebut secara eksplisit saat mengatur ke variabel kemungkinan diperlukan. Tetapi dalam kebanyakan kasus, nilai objek tidak bertipe akan dikonversi ke jenis tertentu secara otomatis ("paksaan") ketika digunakan sebagai parameter fungsi di mana jenisnya adalah jenis sederhana seperti Boolean, angka, atau teks, dan profil parameter fungsi tidak memiliki potensi kelebihan beban yang bertentangan.

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

Selain secara otomatis mengonversi jenis dalam panggilan fungsi, objek yang tidak diketik juga akan dikonversi saat ditetapkan ke properti kontrol, jika memungkinkan.

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

Dan akhirnya, ketika menggunakan operator seperti & or +, objek tidak bertipe akan dipaksa jika tidak ada ambiguitas pada jenis yang diharapkan.

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

Catatan

JSON tidak memiliki jenis GUID, Color, Time , atau DateTime . Nilai-nilai ini direpresentasikan sebagai string. Jika Anda menetapkan nilai objek tidak bertipe JSON yang berisi tanggal ke properti teks secara langsung, teks asli JSON akan digunakan. Ini mungkin penting saat berhadapan dengan zona waktu, format tanggal, dll. Dalam kasus seperti itu, Anda harus secara eksplisit mengonversi nilai menggunakan GUID(),ColorValue (),DateValue (),DateTimeValue (), dll.

Jika nama bidang terdiri dari nama pengidentifikasi yang tidak valid, misalnya saat nama bidang dimulai dengan angka atau berisi karakter yang tidak valid seperti tanda hubung, Anda dapat memasukkan nama bidang dalam tanda kutip tunggal:

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

Power Fx tidak akan mengevaluasi keberadaan bidang sebelum rumus dijalankan. Hal ini memungkinkan fleksibilitas dalam JSON yang akan datang. Misalnya, JSON sebelumnya terkadang berisi bidang tambahan yang disebut Discount. Namun dalam contoh kita sebelumnya, bidang ini tidak ada. Menulis rumus yang menggunakan bidang Discount tidak akan mengakibatkan kesalahan, selama proses pembuatan aplikasi atau saat pengguna menggunakan aplikasi. Jika bidang hilang saat rumus berjalan, nilai hanya akan menghasilkan nilai Blank().

Catatan

JSON mendukung null nilai untuk bidang. Ini juga akan menghasilkan nilai Blank(). Saat ini, tidak ada perbedaan dalam Power Fx antara bidang yang hilang, atau bidang yang memiliki nilai null.

Karena mengakses bidang di Objek yang tidak diketik tidak dievaluasi saat menulis rumus, tidak ada juga Intellisense yang tersedia. JSON dan Power Fx peka terhadap huruf besar-kecil, jadi berhati-hatilah dalam menuliskan nama bidang.

Nilai JSON tidak harus dalam notasi gaya rekaman. JSON yang valid dapat berupa sebuah nilai, seperti "text value", true atau 123.456. Dalam kasus tertentu, Objek yang tidak diketik yang dikembalikan ParseJSON adalah nilai itu sendiri dan notasi titik tidak digunakan.

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

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

Akhirnya, JSON mendukung catatan berlapis. Mengonversi JSON ke Objek yang tidak diketik mengakibatkan objek berlapis, dan notasi titik dapat digunakan untuk melintasi hierarki.

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

Saat mengonversi string JSON ini ke variabel Objek yang tidak diketik yang bernama jsonObject, bidang dapat diakses menggunakan notasi titik.

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"

Jika salah satu bidang dalam ekspresi notasi titik tidak ada, Blank() akan dikembalikan.

Array dan tabel

JSON dapat berisi array nilai atau catatan. Array dapat diakses secara langsung, atau dikonversi ke tabel Power Fx.

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

JSON ini berisi catatan dengan bidang bernama OrderLines yang berisi array catatan. Setiap catatan memiliki dua bidang: Item dan Quantity. Jika JSON dikonversi ke Objek yang tidak diketik menggunakan fungsi ParseJSON dan diatur ke variabel bernama jsonOrder, kami dapat mengakses garis pesanan individual dalam beberapa cara.

Set( jsonOrder, ParseJSON( jsonStringVariable ) );

Anda dapat mengambil catatan dan nilai individual menggunakan fungsi Index(). Misalnya, untuk mendapatkan catatan kedua di bidang OrderLines, Anda dapat mengakses bidang Quantity dan mengonversikannya dalam bentuk nilai.

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

Anda dapat mengonversi array baris pesanan langsung ke dalam bentuk tabel. Tindakan ini akan membuat tabel kolom tunggal dengan Objek yang tidak diketik merepresentasikan catatan.

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

Tabel kolom tunggal 'orderLines' sekarang memiliki kolom 'Nilai' yang mewakili objek yang tidak diketik. Untuk menggunakan salah satu bidang dari catatan dalam tabel ini, gunakan notasi titik untuk mengakses bidang JSON yang spesifik di Objek yang tidak diketik di kolom Value.

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

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

Untuk membuat penggunaan catatan baris pesanan lebih mudah dan lebih sederhana di bagian lain aplikasi Anda, Anda dapat mengonversi seluruh Objek yang tidak diketik ke catatan yang sepenuhnya diketik menggunakan fungsi ForAll(). Menyediakan Objek yang tidak diketik secara langsung ke ForAll() berarti Anda dapat mengakses bidang objek secara langsung. Bukan menggunakan bidang kolom tunggal Value.

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

Variabel typedOrderLines baru sekarang berupa tabel Power Fx yang diketik secara keseluruhan dengan kolom dan nilai berikut:

Item Jumlah
"Widget 1" 3
"Widget 2" 5

Contoh sebelumnya menggunakan array catatan, tetapi JSON juga dapat berisikan array nilai saja. Perhatikan contoh berikut yang berupa string JSON yang valid yang berisikan array dari tiga string.

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

Kita dapat mengambil salah satu item dari array menggunakan fungsi Index(), dan mengonversikannya ke dalam bentuk teks.

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