Εργασία με το JSON στο Power Fx
Το Power Fx επιτρέπει στους δημιουργούς να διαβάζουν JSON σε ένα μη πληκτρολογημένο αντικείμενο χρησιμοποιώντας τη συνάρτηση ParseJSON.
Ανάγνωση και μετατροπή τιμών
Το ParseJSON θα μετατρέψει την ακόλουθη συμβολοσειρά εγγραφής JSON σε πεδία ItemName
μη τυπολογημένο αντικείμενο Quantity
ReleaseDate
with και. 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 ) );
Γενικά, είναι καλή ιδέα να μετατρέψετε ρητά την τιμή ενός μη τυπολογημένου αντικειμένου σε έναν συγκεκριμένο τύπο. Ο ορισμός ενός μη τυπολογημένου αντικειμένου ως μεταβλητή τιμής κάνει τη μεταβλητή επίσης ένα μη τυπολογημένο αντικείμενο. Είναι πιθανό να απαιτείται η μετατροπή μιας τέτοιας τιμής ρητά κατά τη ρύθμιση σε μεταβλητή. Στις περισσότερες περιπτώσεις, όμως, οι τιμές αντικειμένων χωρίς πληκτρολόγηση θα μετατραπούν αυτόματα σε ένα συγκεκριμένο τύπο (εξαναγκασμός) όταν χρησιμοποιούνται ως παράμετροι συνάρτησης, όπου ο τύπος είναι ένας απλός τύπος, όπως δυαδικός τύπος, αριθμός ή κείμενο, και το προφίλ παραμέτρων της συνάρτησης δεν έχει πιθανές διενέξεις υπερφόρτωσης.
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, Color, Time ή DateTime . Αυτές οι τιμές αντιπροσωπεύονται ως συμβολοσειρά. Εάν αναθέσετε απευθείας μια τιμή μη τυπολογημένου αντικειμένου JSON που περιέχει μια ημερομηνία σε μια ιδιότητα κειμένου, θα χρησιμοποιηθεί το αρχικό κείμενο του JSON. Αυτό μπορεί να είναι σημαντικό όταν χρησιμοποιείτε ζώνες ώρας, μορφές ημερομηνίας κλπ. Σε αυτές τις περιπτώσεις, θα πρέπει να μετατρέψετε ρητά τις τιμές χρησιμοποιώντας GUID(), ColorValue(), DateValue(), DateTimeValue(), κλπ.
Στην περίπτωση που ένα όνομα πεδίου αποτελείται από ένα μη έγκυρο όνομα αναγνωριστικού, για παράδειγμα, όταν τα ονόματα πεδίων ξεκινούν με έναν αριθμό ή περιέχουν μη έγκυρους χαρακτήρες, όπως ενωτικό, μπορείτε να βάλετε τα ονόματα πεδίων σε μεμονωμένες προσφορές:
untyped.'01'
untyped.'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' έχει τώρα μια στήλη 'Value' που αντιπροσωπεύει το μη πληκτρολογημένο αντικείμενο. Για να χρησιμοποιήσετε οποιοδήποτε από τα πεδία από μια καρτέλα σε αυτόν τον πίνακα, χρησιμοποιήστε την τελεία για να αποκτήσετε πρόσβαση στο συγκεκριμένο πεδίο 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 με τις ακόλουθες στήλες και τιμές:
Στοιχείο | Ποσότητα |
---|---|
"Γραφικό στοιχείο 1" | 3 |
"Γραφικό στοιχείο 2" | 5 |
Τα προηγούμενα παραδείγματα χρησιμοποιούν πίνακες καρτελών, αλλά το JSON μπορεί επίσης να περιέχει πίνακες μόνο τιμών. Λάβετε υπόψη το παρακάτω παράδειγμα, το οποίο είναι μια έγκυρη συμβολοσειρά JSON που περιέχει έναν πίνακα τριών συμβολοσειρών.
[ "First Item", "Second Item", "Third Item"]
Μπορούμε να ανακτήσουμε ένα από τα στοιχεία από τον πίνακα χρησιμοποιώντας τη συνάρτηση Index() και να το μετατρέψουμε σε κείμενο.
Text( Index( ParseJSON( jsonStringVariable ), 2 ) ) // "Second Item"