cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anonymous
Not applicable

Getting JSON keys in flow

Hi below is the JSON format I am getting from planner API I want User id's from this.

 

{
  "planId": "plan id",
  "bucketId": "bucket Id",
  "title": "test multiple user",
  ...
  ...
  ..
  ..
  "assignments": {
    "User ID 1": {
      ...
      ...
    },
    "User ID 2": {
      ...
      ...
    },
    "User ID 2": {
      ...
      ...
    }
  }
}

Here I want "User ID 1", "User ID 2", "User ID 3". I cant use for each because it's an object, not an array. please help with this.

 

1 ACCEPTED SOLUTION

Accepted Solutions
royg
Impactful Individual
Impactful Individual

Hi, this may be a little too late for the initiator of this thread, but hopefully it may help others.

I give all the credit for this solution to the writer of this blog post (John) who faced the same requirement and suggested using xml/xpath methods.

The real magic is getting the assignments JSON object and converting it to XML.

to do that use a compose action that concatenates a root level to the assignments json (using the assignments JSON without the root fails because attirbutes at the top level get converted creating mutilpe root items).

Compose:

xpath(xml(json(concat('{ "root": ', string(body('HTTPTaskAssignments')), ' }'))
), '/root/assignments/*')
*Note - remember to add the blank space before and after the "root": and before the appended curly braces or your json won't be parsed to xml. Also, stringify the assignments json, This can be broken into several compose actions for readability.
 
The next step is to select the result xml nodes into an array using Select action, use the previous step's Output and map into a new property (UserId for example) the xmlnode name.
Expression:
xpath(item(), 'name(/*)')
 
PlannerFlow.PNG
 
That's it, now you can iterate the select action result to perform actions such as getting the user name etc.
 
Hope this helps someone!
 

View solution in original post

15 REPLIES 15
Sru
Advocate V
Advocate V

Hi @Anonymous

 

use parse jason and apply for each to grab the values using Dynamic content.

formated  your json  and tried, able to see user id values in for each loop. Hope it helps.

 

{
  "planId": "plan id",
  "bucketId": "bucket Id",
  "title": "test multiple user",
  "assignments": [{
    "User ID 1": "a",
    "User ID 2": "b",
    "User ID 3" : "c"
      }]
 
}

 

Anonymous
Not applicable

Thanks for the reply, but for each loop will work only if its array. But my scenario there is no array.

It's a javascript objects with the key-value pair, and I want the list of keys.

v-xida-msft
Community Support
Community Support

Hi @Anonymous,

 

Do you want to use "User ID 1", "User ID 2" and "User ID 3" within "Apply to each" in your flow?

Could you please share a screenshot of your flow's configuration?

Further, do you want to get the "User ID 1" key (User ID 2, User ID 3) or its corresponding value?

 

Yes, you are right. The input parameter of "Apply to each" action is required to fill an array rather than an object. So within your flow, you should convert the Object data into an array firstly, then you could use your JSON data within your "Apply to each" action.

 

If you want to get the "User ID 1" (User ID 2, User ID 3) key within a "Apply to each" action, I afraid that there is no way to get the "User ID 1" (User ID 2, User ID 3) key in Microsoft Flow currently. I have no idea how to get the JSON key within a "Apply to each" action.

 

If you want to get the corresponding value of "User ID 1" ((User ID 2, User ID 3)) key, please take a try with the following workaround:

  • Add a proper trigger, here I use Flow Button trigger.
  • Add a Compose action, Inputs field set to the original JSON format data that you provided as below:
{
  "planId": "plan id",
  "bucketId": "bucket Id",
  "title": "test multiple user",
  "assignments": {
    "User ID 1": {
      "Name": "Kris Dai"
    },
    "User ID 2": {
      "Name": "Angelina"
    },
    "User ID 3": {
      "Name": "Teresa"
    }
  }
}
  • Add a "Compose 2" action, Inputs set to following formula:
array(outputs('Compose')?['assignments'])
  • Add a "Apply to each" action, input parameter set to output of "Compose 2" action.
  • Within "Apply to each", add a "Compose 3" action, Input set to following formula:
item()?['User ID 1']

Note: If you want to get the corresponding value of User ID 2 and User ID 3, please type following formula within above Compose 3 action:

item()?['User ID 2']
item()?['User ID 3']

Image reference:13.JPG

 

14.JPG

The flow works successfully as below:15.JPG

 

 

 

Best regards,

Kris

 

 

 

Community Support Team _ Kris Dai
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
Anonymous
Not applicable

Thanks for your help.

But I need the JSON keys ('User ID 1', 'User ID 3', 'User ID 3') not values so the logic won't work for my scenario.

And even if you put JSON object inside an array you will get same JSON Object while iterating, you won't get the JSON keys or values. so solution won't work.

 

My goal is to get the user ids, Planner API providing the "assignments" JSON object (Not an array).

This JSON object will have "User ID" as key and "User Details" as values.

Since a task can be assigned to anyone, so values inside "assignments" object are dynamic.

I cant hard code the values to get the user id because I will not be knowing to whom the task is assigned.

I have the same problem...  I have JSON returning a bunch of Key and Values and ALL I want to do is to get the value of specific key... why is this so complicated?  Flow is supposed to be for power users, not for developers or ODATA gurus...

having the SAME issue with the planner API. not sure whether i'm more annoyed at flow (for not allowing the ability to grab the key from key/value pairs) or at the Planner API team (who thought it would be a great idea to use the user id as an object key instead of the value).

 

either way, i don't have any ability to associate user-readable names with assigned planner tasks.

If anyone is curious, here's the assignments object returned within the task object:

 

SyntaxEditor Code Snippet

 "assignments": {
      "96586a3d-314e-4146-8def-1dfe72a0a733": {
        "@odata.type": "#microsoft.graph.plannerAssignment",
        "assignedDateTime": "2018-10-08T14:47:31.8329019Z",
        "orderHint": "",
        "assignedBy": {
          "user": {
            "displayName": null,
            "id": "96586a3d-314e-4146-8def-1dfe72a0a733"
          }
        }
      },
      "5b9c9288-4e23-43ba-be30-3eca86e43459": {
        "@odata.type": "#microsoft.graph.plannerAssignment",
        "assignedDateTime": "2018-10-08T14:47:36.7608382Z",
        "orderHint": "",
        "assignedBy": {
          "user": {
            "displayName": null,
            "id": "96586a3d-314e-4146-8def-1dfe72a0a733"
          }
        }
      }
    }
  }

Ok...i came up with one hack of a solution for this that involved creating an Azure Function App (using the underscore.js library) to extract the user id keys, and then calling that app with an http POST from my Flow. It seriously shouldn't have to be this hard.

royg
Impactful Individual
Impactful Individual

Hi, this may be a little too late for the initiator of this thread, but hopefully it may help others.

I give all the credit for this solution to the writer of this blog post (John) who faced the same requirement and suggested using xml/xpath methods.

The real magic is getting the assignments JSON object and converting it to XML.

to do that use a compose action that concatenates a root level to the assignments json (using the assignments JSON without the root fails because attirbutes at the top level get converted creating mutilpe root items).

Compose:

xpath(xml(json(concat('{ "root": ', string(body('HTTPTaskAssignments')), ' }'))
), '/root/assignments/*')
*Note - remember to add the blank space before and after the "root": and before the appended curly braces or your json won't be parsed to xml. Also, stringify the assignments json, This can be broken into several compose actions for readability.
 
The next step is to select the result xml nodes into an array using Select action, use the previous step's Output and map into a new property (UserId for example) the xmlnode name.
Expression:
xpath(item(), 'name(/*)')
 
PlannerFlow.PNG
 
That's it, now you can iterate the select action result to perform actions such as getting the user name etc.
 
Hope this helps someone!
 
Anonymous
Not applicable

Hi @royg,

Thanks for your great  and rigorous solution ! : )

thanks to the following expression :

xpath(item(), 'name(/*)')

we get the name or key (I do not know how to call it) of the node.

 

If I want to get the value of this node, how I do ?

 

Sincerely yours ,

 

Adrien

Hi @Anonymous,

I'm glad this actually helped someone.

To answer your question, I used @StevenWade's payload sample and queried the assignedDateTime field by adding an additional row to the Select action with the following mapping - AssignedDate:

xpath(item(), 'string(/*/assignedDateTime)')

Please let me know if that helps.

Roy 

Anonymous
Not applicable

That's what I wanted !!

Thanks a lot for your quick reply :DDD @roy-gilboa 

Thanks @roy-gilboa , this got me very close to what I wanted but not there yet.

 

Can you help on how to extract the value matching the 'label' & 'prediction'? In the below payload case I want to get "

 0.7955204971" which is matching the 'prediction' value "7"?

 

 

 

{
  "data": [
    {
      "predictionValues": [
        {
          "value": 0.0011699726,
          "label": "1"
        },
        {
          "value": 0.0013717867,
          "label": "10"
        },
        {
          "value": 0.000863159,
          "label": "11"
        },
        {
          "value": 0.0008208039,
          "label": "12"
        },
        {
          "value": 0.0001870127,
          "label": "13"
        },
        {
          "value": 0.0001543465,
          "label": "14"
        },
        {
          "value": 0.0001551285,
          "label": "15"
        },
        {
          "value": 0.0001528833,
          "label": "16"
        },
        {
          "value": 0.0001922927,
          "label": "17"
        },
        {
          "value": 0.0001648636,
          "label": "2"
        },
        {
          "value": 0.0002391713,
          "label": "3"
        },
        {
          "value": 0.00060699,
          "label": "4"
        },
        {
          "value": 0.0150151647,
          "label": "5"
        },
        {
          "value": 0.0873161414,
          "label": "6"
        },
        {
          "value": 0.7955204971,
          "label": "7"
        },
        {
          "value": 0.0695031859,
          "label": "8"
        },
        {
          "value": 0.0265666002,
          "label": "9"
        }
      ],
      "prediction": "7",
      "rowId": 0
    }
  ]
}

 

 

 

I could get to the list using below

 

 

xpath(xml(json(concat('{ "root": ', string(body('JoblevelPredictions3B')), ' }'))
), '/root/data/predictionValues/*')

xpath(xml(item()), 'string(//value)')
xpath(xml(item()), 'string(//label)')

 

 

 

2020-09-13_01-53-08.jpg

 

Hi @gotovamsee,

I'm glad I could help you out.

You could use "Filter Array" action on the array you get from the "Select" action.

Since you asked for the XPATH statement, I think your following action should be another compose action (say Compose_1):

 

xpath(xml(outputs('Compose')), 'string(/root/data/predictionValues[label=../prediction]/value)')

 

Note, that this will retrieve the 1st value that matches the criteria (in your case there is only 1 element that fits this filter, so I guess that suits your requirement).
If you want to filter all elements that meet a criteria for example, you want to get all the values of labels smaller than the prediction, then you would add a Compose action (Compose_1) followed by a Select action:

Compose_1: 
xpath(xml(outputs('Compose')), '/root/data/predictionValues[label<../prediction]/value') 
Select: Compose_1 output 
Value : xpath(item(), 'string(/value)')

Hope this gets you what you need.

Regards,

Roy

If anyone is coming to this later on, I have added an answer in this Stack which indicates how you can make this work for any object and also retrieve the values of the items and place it in a new array for processing.

 

That particular one deals with non-empty values, but that's just a step that can be removed.

Helpful resources

Announcements

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results | Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!    This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Community MembersNumber SolutionsSuper UsersNumber Solutions Deenuji 9 @NathanAlvares24  17 @Anil_g  7 @ManishSolanki  13 @eetuRobo  5 @David_MA  10 @VishnuReddy1997  5 @SpongYe  9JhonatanOB19932 (tie) @Nived_Nambiar  8 @maltie  2 (tie)   @PA-Noob  2 (tie)   @LukeMcG  2 (tie)   @tgut03  2 (tie)       Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 2: Community MembersSolutionsSuper UsersSolutionsPower Automate  @Deenuji  12@ManishSolanki 19 @Anil_g  10 @NathanAlvares24  17 @VishnuReddy1997  6 @Expiscornovus  10 @Tjan  5 @Nived_Nambiar  10 @eetuRobo  3 @SudeepGhatakNZ 8     Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 3:Community MembersSolutionsSuper UsersSolutionsPower Automate Deenuji32ManishSolanki55VishnuReddy199724NathanAlvares2444Anil_g22SudeepGhatakNZ40eetuRobo18Nived_Nambiar28Tjan8David_MA22   Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 4:Community MembersSolutionsSuper UsersSolutionsPower Automate Deenuji11FLMike31Sayan11ManishSolanki16VishnuReddy199710creativeopinion14Akshansh-Sharma3SudeepGhatakNZ7claudiovc2CFernandes5 misc2Nived_Nambiar5 Usernametwice232rzaneti5 eetuRobo2   Anil_g2   SharonS2  

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages

Users online (1,487)