It’s been roughly two months since we released ParseJSON as an experimental feature in Power Apps. A lot of scenarios for makers have been unblocked with this feature, and we’ve seen great uptake even though it’s still considered experimental. We’re anxious to get this out of that experimental status. I wanted to take the opportunity to highlight a recent improvement, and address feedback with some of the future plans we have once we take ParseJSON (and untyped objects) out of the experimental phase.
Finally, and most importantly, I’m asking for your feedback. I will elaborate below but if you’re using ParseJSON I would love to hear from you. We’ve seen comparatively low feedback given the amount of usage. This is probably a good sign, but it makes us a little nervous pushing to preview or GA without making sure there aren’t any issues we just haven’t heard about.
Update since experimental launch
You can now use ForAll(), like Index(), directly on an untyped object. A JSON object array such as [ { “id”: 1, “Title”: “One” }, { “id”: 2, “Title”: “Two” } ] would previously require a Table(ParseJSON()) call before going to ForAll. This has the added drawback of resulting in a single-column table with untyped objects, so you would get something like:
ForAll( Table(untypedObject), { id: Value(ThisRecord.Value.id) )
requiring you to use the .Value field on ThisRecord for the single-column table. You can now pass untyped objects directly into ForAll, which no longer creates a single-column table requiring the use of the Value column. So the previous example becomes:
ForAll( untypedObject, { id: Value(ThisRecord.id) )
Feedback so far
The feedback we’ve received so far is positive in that this feature unblocks many scenarios involving JSON. There are two recurring points of feedback we’ve heard from multiple customers:
- The feature is very “verbose” today due to the requirement of casting every field individually to a specific type. If you set a table of untyped objects as the Items source of a gallery, each use of a field requires Value(), Text() and other casting everywhere you wish to use the fields. For now you can consider using ForAll to type everything into a typed table first, as shown above, making field access easier. Our ultimate goal is to allow you to define your own type schemas and cast the whole JSON to it. We envision this feature to be used with the ParseJSON() function, where you pass in the JSON string as well as the type you defined, and the result of ParseJSON() would then be a typed object as opposed to an untyped object that requires casting. To be clear, we intend to GA ParseJSON with untyped objects first, and add the new typing features later on.
- Using ParseJSON() with connectors. If a column from a datasource contains a string with JSON, that is easy enough. But we’ve heard of scenarios where makers want to take the whole response message from a connector and manually parse the JSON when the app runs. The connector team is looking to build on top of our work with untyped objects, and beyond that also the previously mentioned type schema definitions to take connectors to a new level. The experimental Dynamic Schema feature is great but is missing some features and flexibility in Power Fx, and we’re starting to address those in Power Fx (with untyped objects and type definitions). There’s some short and long term work going on that I hope you will get to hear about soon.
If you have any feedback or concrete scenarios you’d like to share, I'd love it if you could comment on this thread. I would love to understand how you’re using ParseJSON or trying to use ParseJSON!