I know this has already been answered several ways, but let's not overlook embedded SQL as an option.

&sql(select JSON_OBJECT('Name':Name,'Title':Title,'Company':Company,'Phone':Phone, 'DOB':DOB) INTO :person WHERE ID = 1)
set personobj = {}.%FromJSON(person)

This can get a little unruly for tables with a lot of columns, but if you're wanting to pick out certain specific columns or customize the JSON field names, this approach gives you that flexibility.

I wrote my own class that does some fun, magical stuff. Here's the class:

/// This class can be used to make a status code do some basic handling on its own when it becomes an error status.
/// For example:<br /><br />
/// set status = ##class(DH.WatchedStatus).New("RW")<br />
/// set status.sc = (some method that returns a status here)<br /><br />
/// If the method returns an error status, it will immediately be written, and the status will change back to $$$OK.<br />
/// Note that if ..sc is not set back to an $$$OK status, either automatically or manually, error handling will not trigger again on the next error.
Class DH.WatchedStatus Extends %RegisteredObject
{

/// This is the status code to be watched.
Property sc As %Status [ InitialExpression = 1, SqlComputeCode = {set {*} = ##class(DH.WatchedStatus).Reset({sc},{resetSelf})}, SqlComputed, SqlComputeOnChange = isErr ];

/// Used to track if the status code is an error. This is necessary for some shenanigans with SQLComputeCode between this flag and the status code.
Property isErr As %Boolean [ InitialExpression = 0, SqlComputeCode = {set {*} = ##class(DH.WatchedStatus).ErrCheck({sc},{writeSelf},{logSelf},{throwSelf})}, SqlComputed, SqlComputeOnChange = sc ];

/// If true, this will will throw ..sc as soon as it becomes an error.
Property throwSelf As %Boolean [ InitialExpression = 0 ];

/// If true, this will log ..sc as an Exception as soon as it becomes an error.
Property logSelf As %Boolean [ InitialExpression = 0 ];

/// If true, this will write the error text of ..sc as soon as it becomes an error.
Property writeSelf As %Boolean [ InitialExpression = 0 ];

/// If true, after other error handling, ..sc will be reset to $$$OK.
/// Note that if this is false, you will need to reset the status yourself for the automatic handling to trigger again.
Property resetSelf As %Boolean [ InitialExpression = 0 ];

/// Handles status according to flags set, then sets isErr.
ClassMethod ErrCheck(sc, writeSelf, logSelf, throwSelf) As %Boolean [ Internal ]
{
	if $$$ISERR(sc){
		if writeSelf{
			write $SYSTEM.Status.GetErrorText(sc)
		}
		if logSelf = 1{
			do ##class(%Exception.StatusException).CreateFromStatus(sc).Log()
		}
		if throwSelf = 1{
			$$$ThrowStatus(sc)
		}
		quit 1
	}
	else{
		quit 0
	}
}

/// If resetSelf is true, resets the status code after error handling occurs.
ClassMethod Reset(sc, resetSelf) As %Status [ Internal ]
{
	return:resetSelf $$$OK
	return sc
}

/// flags is a string which determines status behavior when an error occurs
/// T = throw the status
/// L = log the status as an exception
/// W = write the status error text
/// R = reset status after error handling; if set, isErr goes back to 0 and sc goes back to 1
ClassMethod New(flags As %String) As DH.WatchedStatus
{
	set status = ##class(DH.WatchedStatus).%New()
	set flags = $ZCVT(flags,"U")
	set:(flags [ "T") status.throwSelf = 1
	set:(flags [ "L") status.logSelf = 1
	set:(flags [ "W") status.writeSelf = 1
	set:(flags [ "R") status.resetSelf = 1
	return status
}

}

Here's how I can use it:

set mystatus = ##class(WoodWare.Status).New("WR")
set mystatus.sc = (something that returns a status)

Having done that, since I used the write and reset flags in the constructor, it will write out the error text and then reset the status object back to $$$OK. I can use this to save myself from constantly having to check whether the status is an error and log or throw it in other code outside the terminal too. It essentially watches itself.

Update: this is now available on IPM.

install watchedstatus

If it's a simple get request, you can test from the terminal without setting up a %Net.HttpRequest. I usually do it like this, in a terminal (for more complicated ones with a request body, you have to initialize %request to a %CSP.Request and set it up too):

set %response = ##class(%CSP.Response).%New()
do ##class(Your.Class).YourMethod(yourarguments)
zw %response

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.)