Παρόλο που η πλειοψηφία των responses στα actions του Power Automate είναι JSON , συνήθως σε απλά flows η ανάγκη για επεξεργασία του κρύβεται πίσω από το Add Dynamic Content. Υπάρχουν περιπτώσεις όμως που θα χρειαστεί να χειριστούμε ένα JSON μόνοι μας. Για το κάνουμε αυτό όμως πρέπει πρώτα να καταλάβουμε τι είναι το JSON και ποια η δομή του.
Τι είναι το JSON
To JSON (JavaScript Object Notation) είναι ένα ελαφρύ πρότυπο ανταλλαγής δεδομένων. Συνήθως χρησιμοποιείται για τη μεταφορά δεδομένων ανάμεσα σε έναν διακομιστή και έναν πελάτη (Client – Server), ή ανάμεσα σε διάφορες εφαρμογές που χρησιμοποιούν διαφορετικές γλώσσες προγραμματισμού.
Είναι εύκολο για τους ανθρώπους να το διαβάσουν και γράψουν αλλά και για τις μηχανές να το αναλύσουν (parse) και να το παράγουν (generate). Το JSON ακολουθεί ένα απλό συντακτικό και περιγράφει τα δεδομένα ως αντικείμενα, συμβολοσειρές, αριθμούς, λίστες και λογικές τιμές. Η σύνταξη του JSON είναι παρόμοια με την σύνταξη των αντικειμένων JavaScript και μπορεί να περιέχει κλειδιά και τιμές.
Κανόνες σύνταξης
- Τα δεδομένα είναι σε ζεύγη ονόματος/τιμής (name/value pairs)
- Τα δεδομένα διαχωρίζονται με κόμμα (,)
- Τα αντικείμενα (objects) βρίσκονται ανάμεσα σε curly braces ( {…} )
- Οι πίνακες (arrays) βρίσκονται ανάμεσα σε square brackets ( […] )
Παραδείγματα
Ας δούμε μερικά παραδείγματα, που θα μας βοηθήσουν να καταλάβουμε τη δομή του.
{ "name": "John", "surname": "Doe", "age": 31 }
Παραπάνω έχουμε ένα object, με 3 name:value pairs: Name: John, Surname: Doe και Age: 31
{ "employees": [ "John", "Anna", "Peter" ] }
Εδώ έχουμε πάλι ένα object, με 1 name:value pair. Το name είναι employees και το value ένα array με τρία strings John, Anna και Peter
{
"employees": [
{ "name": "Ram", "email": "ram@gmail.com", "age": 23 },
{ "name": "Shyam", "email": "shyam23@gmail.com", "age": 28 },
{ "name": "John", "email": "john@gmail.com", "age": 33 },
{ "name": "Bob", "email": "bob32@gmail.com", "age": 41 }
]
}
Στο παραπάνω JSON το value του employees είναι πάλι ένα array. Αυτή τη φορά όμως αντί για array από strings έχουμε array από objects.
Στα responses από το Dataverse σχεδόν πάντα έχουμε τα δεδομένα σε ένα array από objects.
{
"employee":{
"name": "Ram",
"age": 42
"address": {
"street": "Aristomenous",
"number": 3
}
"phones": ["2130179000","6948000000"]
}
}
Άλλο ένα “περίπλοκο” παράδειγμα εδώ. To value του employee είναι ένα object. Σε αυτό το object υπάρχουν:
- Το name με τιμή RAM
- To age με τιμή 42
- Το address με τιμή ένα άλλο object
- και το phones με τιμή ένα array
{
"employees": [
{"name": "Ram", "age": 42 ,"address": null},
{"name": "Don", "age": 32 },
{"name": "Lup", "age": 22 ,"address": "Aristomenous 3"},
}
Σε αυτό το παράδειγμα έχουμε 2 τρόπους με τους οποίους μπορεί να εμφανιστεί το null σε ένα JSON response. Είτε το value στο ζεύγος θα έχει τιμή null (όπως η διεύθυνση του Ram) , είτε θα απουσιάζει τελείως το σχετικό pair από την απάντηση (όπως η διεύθυνση του Don). Δυστυχώς στα responses του Dataverse το null εμφανίζεται με το δεύτερο τρόπο.
Στα responses του Dataverse όταν υπάρχει value null απουσιάζει τελείως το αντίστοιχο pair.
Ένα τυπικό Dataverse response
Εάν κάνουμε ένα list rows στα Accounts το raw response είναι κάπως έτσι:
{
"statusCode": 200,
"headers": {
"Vary": "Accept-Encoding",
"x-ms-service-request-id": "0037d953-c395-49a1-8874-e1abdad65e8f,5b90717d-2e13-442c-8988-8f9cdd35505d",
"Cache-Control": "no-cache",
"Date": "Tue, 30 May 2023 10:35:21 GMT",
"Allow": "OPTIONS,GET,HEAD,POST",
"Content-Type": "application/json; odata.metadata=full",
"Expires": "-1",
"Content-Length": "196478"
},
"body": {
"@odata.context": "https://xxx.crm4.dynamics.com/api/data/v9.1/$metadata#accounts",
"#Microsoft.Dynamics.CRM.DeleteMultiple": {
"title": "DeleteMultiple",
"target": "https://xxx.crm4.dynamics.com/api/data/v9.1/accounts/Microsoft.Dynamics.CRM.crmbaseentity/Microsoft.Dynamics.CRM.DeleteMultiple"
},
"@Microsoft.Dynamics.CRM.totalrecordcount": -1,
"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded": false,
"@Microsoft.Dynamics.CRM.globalmetadataversion": "75446433",
"value": [
{
"@odata.type": "#Microsoft.Dynamics.CRM.account",
"@odata.id": "https://xxx.crm4.dynamics.com/api/data/v9.1/accounts(88cea450-cb0c-ea11-a813-000d3a1b1223)",
"@odata.etag": "W/\"58505166\"",
"@odata.editLink": "accounts(88cea450-cb0c-ea11-a813-000d3a1b1223)",
"numberofemployees": 50,
"description": "Our publically traded company has been in business for 105 years. With more than 90 years’ experience in the textile industry, we are one of the most trusted names in textiles, offering an unmatched level of quality and selection of product lines. Our manufacturing facilities around the world position us to support our customers with all their textile needs.",
"name": "Fabrikam, Inc.",
"address1_line1": "6789 Edwards Ave.",
},
{
"@odata.type": "#Microsoft.Dynamics.CRM.account",
"@odata.id": "https://xxx.crm4.dynamics.com/api/data/v9.1/accounts(a4cea450-cb0c-ea11-a813-000d3a1b1223)",
"@odata.etag": "W/\"58556252\"",
"@odata.editLink": "accounts(a4cea450-cb0c-ea11-a813-000d3a1b1223)",
"numberofemployees": 20,
"description": "Trey Research is a manufacturer of specialty circuit boards as well as fully assembled devices and is known for quick turnaround and timely delivery of quality products, at a premium price. Trey Research takes pride in looking after its workforce and has invested heavily in a state-of-the-art cafeteria at their production facilities.",
"name": "Trey Research",
"address1_line1": "789 3rd St",
}
]
}
}
Τα δεδομένα του Accounts που μας ενδιαφέρουν βρίσκονται στο array από objects “values” στη γραμμή 22. Κάθε object σε αυτό το array είναι και ένα account.
Σε επόμενα posts θα δούμε πώς μπορούμε να χειριστούμε αυτά τα responses, γιατί το flow μας γεμίζει με περιττά ForEach και πώς μπορούμε να το αποφύγουμε.