Lee
Lee

Reputation: 999

Using JSON Data with Coldfusion

I've worked with JSON data in the past - mainly 'fudging' my way to a solution, and not really understanding why or how things work. I've come across an issue where the data being returned looks somewhat different to what I've seen before, and I can't find any examples that match it.

Here's an example of the data returned (via an API);

{"domain.co.uk":{"status":"available","classkey":"thirdleveldotuk"},"domain.net":{"status":"available","classkey":"dotnet"},"domain.com":{"status":"available","classkey":"domcno"}}

On my front-end, I need to return something like this -

Because the 'domain.com' etc value will always change, I can't map the names as I usually would (although it will always be 3 'rows' returned)

I've checked every CF Book I own, and read the online CF Docs, but I'm totally at a loss as to where to even start with this one!

Pointers much appreciated!

Upvotes: 4

Views: 9980

Answers (2)

Leigh
Leigh

Reputation: 28873

(This is really more of a comment, but is a bit too long ... )

I've worked with JSON data in the past - mainly 'fudging' my way to a solution, and not really understanding why or how things work

JSON strings are essentially just a representations of two objects:

  • arrays which are denoted by [] and
  • structures (or objects) which are denoted by {}

Looking at the API string, the braces {} indicate you are dealing with a structure:

     { "theKey": "theValue" }

In your case, the domain name is the structure key:

    { "domain.co.uk": "theValue" }

.. and the value is a nested structure containing two static keys: "status" and "classkey"

    { "theKey":  {"status":"available","classkey":"thirdleveldotuk"}  }

As with any structure, you can iterate through the keys dynamically using a for .. in loop, a collection loop if you prefer cfml.

     for (theKey in theStruct) {
         WriteDump( theKey ); // ie "domain.co.uk"
     }

Then inside the loop use associative array notation to grab the value, ie:

     theStatus = theStruct[ theKey ]["status"]; // "available"

     // ... OR
     theValue  = theStruct[ theKey ]; 
     theStatus = theValue.status;

That is all there is to it. You can use similar logic to access any type of nested structures.

Upvotes: 8

J.T.
J.T.

Reputation: 2616

If you run this with deserializeJSON(data), you'll see that you just end up with structures with nested structures. So, you can loop through your struct, grab the keys and then grab that key's status. In JSON terms, your JSON object has nested objects.

<cfset data = deserializeJSON(apiData) />
<cfset formattedData = [] />
<cfset tmp = {} />

<cfloop collection=#data# item="domain">
    <cfset tmp.domain = domain />
    <cfset tmp.status = data[domain]["status"] />
    <cfset arrayAppend(formattedData,duplicate(tmp)) />
</cfloop>

<cfdump var=#formattedData# />

Upvotes: 10

Related Questions