Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

JSON is a lightweight, plain text data format. It’s become a standard that is widely used across many industries, even including healthcare.

Its simplicity simple structure makes it a good example to review some key Lua and Translator concepts. Lets start!

Let's set up a simple filter component that parses a JSON object and ignores data with emails not containing the "interfaceware.com" domain name.

Use the following file:

See Sample Data for how to add sample files to a project
Expand
titleAdd Sample Data by importing the provided sample file
Import the JSON Filter Tutorial component using +FROM URL

UseCreate component +FROM URL to import the component.

Copy paste the following URL:

Code Block
git@bitbucket.org:interfaceware/json_tutorial.git

This component includes Sample Data to make it easier to learn how to filter messages.

Expand
titleClick on the Customize then the Copy and Edit button so you can access the Translator and alter the code

Refer to Edit a Component to see how it's done if you have not done this before.

...

Now
Expand
titleUse the Annotation Window to view your sample data in the String Viewing Window as Escaped Text.

Now we are in the Developing in the Translator!

Every Translator component contains a Main.lua module with a main Functions that is called each time a message is received or on a configured poll time.

Notice we can see our sample data (Variables named Data) passed to main functionby looking at the Annotation Windows.

If we click on the sample data in the annotations, we can view it using The string viewing window in Escaped Text view.

Notice, how the JSON object is formatted. Each line ends with a newline “\n” character. We can use this to parse and process the JSON.

Image Removed

Expand
titleUse string.split() to parse the JSON sample data

You can use String:split() to split the function on (“\n”):

Code Block
local List = Data:split("\n")
trace(List)

By Using trace() function, we can click on the List in the annoations. You should see the following:

This string is now split into a table with individual lines you can now process. This is great... but with Iguana, we’ve made it a little easier to efficiently parse and process JSON.

Image Removed
Expand
titleParse the JSON sample data using json.parse{data=Data}
Code Block
languagelua
local patient = json.parse{data=Data}

JSON objects are parsed into Lua tables. You can see this clearly in the Annotation Window.

Image Removed

...

if statements

...

.

Image Added
Expand
titleParse the JSON sample data using json.parse{data=Data}

In main, parse the JSON sample data by passing Data. Create and assign the parsed data to a patient variable.

Code Block
languagelua
local patient = json.parse{data=Data}

JSON objects are parsed into Lua tables as dictionaries with key-value pairs. You can see this by clicking the resulting table in the Annotation Window.

Image Added
Expand
titleCreate a filter.lua module to start building a filter function

Use the Create a File button to create a new filters.lua file in your Project Tree. Click Create.

Notice that when you create a new lua file, Iguana will automatically add a Require Statement to main.lua.

Image Added
Expand
titleCreate a filter function in filters.lua

Notice we are brought to an empty filters.lua script in the project tree. Lets add our filtering logic:

First, create a filter function Block statements and pass patient as the parameter.

Code Block
languagelua
function filter(patient)
   
end 

Then go into main and call your filter function, passing your parsed patient JSON as the expected parameter.

Image Added

Notice after calling our filter function,

Navigate back to the filter.lua by clicking the purple filter in the Annotation Windows, notice there is now an annotation block we can use to add the rest of the logic.

Expand
titleIn our filter function, first split the patient contact email to isolate the email domain name

Using String:split(), we can split the email on “@“ and get the domain name.

Try this code and take a look at your annotations to see the result:

Code Block
languagelua
local email = patient.contact.email
local domain = email:split("@")[2]
trace(domain)

Specifying the second result [2] of the split table, I can capture just the domain name.

Expand
titleUse an if statement to test if an email domain does not equal to "interfaceware.com"

Using if statements, we can test conditions to be false and filter out data we are not interested in processing:

Image Added

Now lets go back to main and change the way we are calling our filter function to address the boolean values (true/false) being returned.

Expand
titleUse another if statement in main to test if a message should be queued or filtered out

Your main function should look like this:

Image Added

This if statement is testing if the filter function returns true - the domain name equalled “interfaceware.com” - then queue the message to be processed by the next component.

See Push Messages to a Component Queue.

Expand
titleNow let's see our filtering in action by going through the sample data and viewing the annotations

By switching which Sample Data is being passed to main, we can see the results and test how our filter function works, by using the annotations.

Navigate to filters.lua and switch to the second sample data to see the sample message fail the condition and return false.

Image Added
Expand
titleAdd custom logging to your filter to make it more comprehensive

Now that the annotations are active for the failed scenario, we can leverage them to add Custom Logging to add more visibility into the logs.

For example,

Code Block
languagelua
if domain == 'interfaceware.com' then
  return true
else 
  iguana.log('Filtered out message with: '..domain)   
  return false
end

You’re done the filter! Don’t forget to Commit and Push Changes to Git.

Now back to the Orientation!