Power Fx'te JSON ile çalışma
Power Fx, üreticilerin ParseJSON işlevini kullanarak Türü belirsiz bir nesne içinde JSON okumasına izin verir.
Değerleri okuma ve dönüştürme
ParseJSON , aşağıdaki JSON kayıt dizesini alanlarla türü belirtilmemiş nesne'yeItemName
Quantity
dönüştürür,, ReleaseDate
ve AvailableForPreOrder
.
{
"ItemName" : "Widget 1",
"Quantity" : 46,
"ReleaseDate" : "2022-09-01",
"AvailableForPreOrder" : true
}
Alanların her birine ParseJSON'dan döndürülen Türü belirsiz nesne değerindeki nokta gösterimi kullanılarak erişilebilir.
Set( untyped, ParseJSON( jsonStringVariable ) );
Set( item, Text ( untyped.ItemName ) );
Set( quantity, Value ( untyped.Quantity ) );
Set( release, DateValue ( untyped.ReleaseDate ) );
Set( preorder, Boolean ( untyped.AvailableForPreOrder ) );
Türü belirtilmemiş bir nesnenin değerini açıkça belirli bir türe dönüştürmek genellikle iyi bir fikirdir. Türü belirtilmemiş bir nesneyi değişken değeri olarak ayarlamak, değişkeni Türü belirtilmemiş nesne yapar. Bu nedenle, bir değişkene ayarlanırken bu tür bir değerin açıkça dönüştürülmesi muhtemelen gereklidir. Ancak çoğu durumda türü belirtilmemiş nesne değerleri, türün boole, sayı veya metin gibi basit bir tür olduğu ve işlevin parametre profilinde olası çakışan aşırı yüklemelerin bulunmadığı işlev parametreleri olarak kullanıldığında otomatik olarak ("coerce") belirli bir türe dönüşecektir.
Left( untyped.ItemName, 1 ); // "W"
Radians( untyped.Quantity ); // 0.80285146
If (untyped.AvailableForPreOrder, "Available", "Not Available" ); // "Available"
İşlev çağrılarında türün otomatik olarak dönüştürülmesine ek olarak, türü belirtilmemiş nesneler de mümkün olduğunda denetim özelliklerine atandığında dönüştürülecektir.
Label1.Text: untyped.Quantity
InputText1.Default: untyped.ItemName
Ve son olarak, & veya + gibi işleçler kullanıldığında, beklenen türde herhangi bir belirsizlik yoksa Türlenmemiş bir nesneye zorlanacaktır.
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
Not
JSON'un GUID , Color, Time veya DateTime türü yoktur. Bu değerler bir dize olarak gösterilir. Tarih içeren bir JSON türü belirtilmemiş nesne değerini doğrudan bir metin özelliğine atarsanız JSON'ın orijinal metni kullanılır. Bu, saat dilimleri, tarih biçimleri vb. ile uğraşırken önemli olabilir. Bu gibi durumlarda GUID(), ColorValue(), DateValue(), DateTimeValue() vb. kullanarak değerleri açıkça dönüştürmelisiniz.
Bir alan adı, geçersiz bir tanımlayıcı adından oluşuyorsa (örneğin alan adları bir sayıyla başladığında veya kısa çizgi gibi geçersiz karakterler içerdiğinde) alan adlarını tek tırnak işaretleri içine koyabilirsiniz:
untyped.'01'
untyped.'my-field'
Power Fx, formül çalıştırılıncaya kadar alanın varlığını değerlendirmez. Bu, gelen JSON içinde esnekliğe izin verir. Örneğin önceki JSON, bazen Discount
adlı ekstra bir alan içerebilir. Ancak önceki örneğimizde bu alan mevcut değildir.
Discount
alanını kullanan bir formülün yazılması, uygulama oluşturma işlemi sırasında veya kullanıcılar uygulamayı kullandığında herhangi bir hataya neden olmaz. Formül çalıştığında alan eksikse değer yalnızca Blank() değeriyle sonuçlanır.
Not
JSON , alanlar için değerleri destekler null
. Bunlar aynı zamanda Blank() değerleriyle sonuçlanır. Şu anda Power Fx içinde eksik bir alan veya null
değerine sahip bir alan arasında ayrım yoktur.
Formül yazılırken Türü belirsiz nesnelerde alanlara erişim değerlendirilmediğinden, Intellisense de mevcut değildir. Hem JSON hem de Power Fx büyük/küçük harfe duyarlıdır; bu nedenle alan adlarının yazılması sırasında ekstra özen gösterin.
JSON değerlerinin kayıt stili gösteriminde olması gerekmez. Geçerli JSON, sadece "text value"
, true
veya 123.456
gibi bir değer olabilir. Böyle bir durumda ParseJSON öğesinin döndürdüğü Türü belirsiz nesne değerin kendisidir ve nokta gösterimi kullanılmaz.
Set( myText, Boolean( ParseJSON( "true" ) ) );
Set( myNumber, Value( ParseJSON( "123.456" ) ) );
Son olarak JSON iç içe kayıtları destekler. Bu tür bir JSON'un Türü belirsiz nesneye dönüştürülmesi, yuvalanmış nesnelere neden olabilir ve nokta gösterimi hiyerarşide dolaşmak için kullanılabilir.
{
"Version" : 1,
"RootElement" : {
"Parent" : {
"Name" : "This is the parent",
"Child" : {
"Name" : "This is the child"
}
}
}
}
Bu JSON dizesini jsonObject
adlı Türü belirsiz nesne değişkenine dönüştürürken alanlara nokta gösterimi kullanılarak erişilebilir.
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"
Nokta gösterimi ifadesindeki alanlardan herhangi biri mevcut değilse Blank() döndürülür.
Diziler ve tablolar
JSON , değer veya kayıt dizileri içerebilir. Bu dizilere doğrudan erişilebilir veya Power Fx tablolarına dönüştürülebilir.
{
"OrderNumber" : "SO000010",
"CustomerID" : "CUST0126",
"OrderLines" : [
{
"Item" : "Widget 1",
"Quantity" : 3
},
{
"Item" : "Widget 2",
"Quantity" : 5
}
]
}
Bu JSON, bir dizi kayıt içeren OrderLines
adlı alana sahip bir kayıt içerir. Her kaydın iki alanı vardır: Item
ve Quantity
.
JSON, ParseJSON işlevi kullanılarak Türü belirsiz bir nesneye dönüştürülürse ve jsonOrder
adlı bir değişkene ayarlanırsa her sipariş satırına birkaç farklı yolla erişebiliriz.
Set( jsonOrder, ParseJSON( jsonStringVariable ) );
Index() işlevini kullanarak kayıtları ve değerleri ayrı ayrı alabilirsiniz. Örneğin, OrderLines
alanındaki ikinci kaydı almak için Quantity
alanına erişin ve bunu bir değere dönüştürün.
Set( line2Quantity, Value( Index( jsonOrder.OrderLines, 2 ).Quantity ); // 5
Sipariş satırları dizisini doğrudan bir tabloya dönüştürebilirsiniz. Bu işlem, kaydı temsil eden Türü belirsiz bir nesneye sahip tek sütunlu bir tablo oluşturur.
Set( orderLines, Table( jsonOrder.OrderLines ) );
Tek sütunlu tablo "orderLines" artık Türü belirsiz nesneyi temsil eden bir "Value" sütunu içerir. Bu tablodaki bir kaydın alanlarından herhangi birini kullanmak için, Value
sütunundaki Türü belirsiz nesne üzerinde belirli JSON alanına erişmek için nokta gösterimini kullanın.
Set( jsonRecord, Index( orderLines, 2 ) ); // Get the second record in the table
Set( line2Item, Text( jsonRecord.Value.Item ) ); // "Widget 2"
Uygulamanızın diğer kısımlarında sipariş satırı kayıtlarının kullanımını daha kolay ve daha basit hale getirmek için, ForAll() işlevini kullanarak tüm Türü belirsiz nesneyi tamamen türü belirtilmiş kayda dönüştürebilirsiniz.
Türü belirsiz nesneyi doğrudan ForAll() işlevine sağlamak, tek sütunlu Value
alanını kullanmak yerine, doğrudan nesne alanlarına erişebileceğiniz anlamına gelir.
Set( typedOrderLines, ForAll( jsonOrder.OrderLines, { Item : Text( ThisRecord.Item ), Quantity : Value( ThisRecord.Quantity ) } ) );
Yeni typedOrderLines
değişkeni artık aşağıdaki sütunlar ve değerlerle tam olarak türü belirtilmiş Power Fx tablosudur:
Kalem | Miktar |
---|---|
"Arabirim öğesi 1" | 3 |
"Arabirim öğesi 2" | 5 |
Önceki örnekler kayıt dizilerini kullanır, ancak JSON aynı zamanda yalnızca değerlerin dizilerini da içerebilir. Üç dizenin bir dizisini içeren geçerli bir JSON dizesi olan aşağıdaki örneği göz önünde bulundurun.
[ "First Item", "Second Item", "Third Item"]
Dizideki öğelerden birini Index() işlevini kullanarak alabilir ve bunu metne dönüştürebilirsiniz.
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"