You'll use both %Library.DynamicObject and %Library.DynamicArray classes for this. When you do JSON.%Get("Practice") the resulting object is a dynamic array, not a dynamic object, so it works a little differently. Then when you get the first element of the array, you have another dynamic object. Try:

//Get the array Practice
set array = JSON.%Get("Practice")
//Get item 0 from the array we just got
set nodejson = array.%Get(0)
//Get the value of Node
set node = nodejson.%Get("Node")
//Write the value out (or do whatever else you need)
write node

@Sammy Lee 
@Marc Mundt 
I'm able to replicate some of this behavior if I use the developer tools in Edge, go to the network tab, and use Network Request Blocking to block *algolia*. The issue might be with the XHR requests there.

@Scott Roth 
In Edge, if you bring up the developer tools, go to the network tab, and in the filter buttons, click on XHR, then start typing in the search box, do you see errors there? (GIF shows what some good requests look like, followed by what errors might look like.)

 

The documentation for the Read method says "Some stream classes use this to optimize the amount of data returned to align this with the underlying storage of the stream." I take this to mean that for a file stream, it might be trying to read in a way that aligns with how the drive is formatted. Can you run the command below and see if the Bytes Per Cluster is 1024?

C:\Windows\System32>fsutil fsinfo ntfsInfo C:
NTFS Volume Serial Number :        0x0060ba3960ba356e
NTFS Version      :                3.1
LFS Version       :                2.0
Total Sectors     :                997,918,719  (475.8 GB)
Total Clusters    :                124,739,839  (475.8 GB)
Free Clusters     :                 96,063,960  (366.5 GB)
Total Reserved Clusters :              893,290  (  3.4 GB)
Reserved For Storage Reserve :         884,043  (  3.4 GB)
Bytes Per Sector  :                512
Bytes Per Physical Sector :        512
Bytes Per Cluster :                4096  (4 KB)
Bytes Per FileRecord Segment    :  1024
Clusters Per FileRecord Segment :  0
Mft Valid Data Length :            512.50 MB
Mft Start Lcn  :                   0x00000000000c0000
Mft2 Start Lcn :                   0x0000000000000002
Mft Zone Start :                   0x0000000001d59580
Mft Zone End   :                   0x0000000001d65da0
MFT Zone Size  :                   200.13 MB
Max Device Trim Extent Count :     256
Max Device Trim Byte Count :       0xffffffff
Max Volume Trim Extent Count :     62
Max Volume Trim Byte Count :       0x40000000
Resource Manager Identifier :      BBA1AD65-C5EC-11EE-8ED5-D0AD0854D65E

If you use a dataCombo, the first column of the SQL query is the actual value of the dataCombo and the second column is the display value. So if you defined a dataCombo with sql="select Analyst, Analyst->Name from Analysts" (or whatever your table is) you'll get what you want.

In that case, you'll also want to define the sqlLookup property of the dataCombo. That tells the Zen page how to find the correct display value when the value of the control is changed programatically, so something like "select Analyst->Name from Analysts where Analyst=?"

Performance is number one for us. With properly defined and tuned tables, I've never seen a database run its queries faster than IRIS.

Also just a lot of native capabilities. It's pretty rare that we have to reach outside of what comes in the box. And now with embedded Python, when we do need to add something, we have a lot of options.

Aside from Python's technical benefits, there's also a personnel consideration. More and more younger developers are learning Python, and according to the PYPL index Python passed Java in popularity among learners in 2018 and is far beyond Java today. That means having Python as an option opens up your hiring pool more than any other language to the next generation of developers.