Sidebar

How can I convert JSON to HL7 format?

+1 vote
7.8K views
asked Aug 14, 2017 by (130 points)

2 Answers

+1 vote

There are two different ways to do this.  In this answer I will give an example of creating each segment individually in the script.  For this example, we will use the following JSON message:

{
  "person": {
    "id": "1234",
    "mrn": "125-54664",
    "name": {
      "first": "Mickey",
      "middle": "",
      "last": "Mouse"
    },
    "dob": "1965-07-04",
    "ssn": "111-22-3333",
    "address": {
      "type": "home",
      "street1": "128 Viewcrest Ln",
      "street2": "suite 200",
      "city": "Bondville",
      "state": "CA",
      "zip": "94033"
    }
  }
}

Now in our first mapping function we will execute the following script:

// create blank HL7 Message
message = qie.createHL7Message('UTF-8');

// Create MSH Segment
message.setNode("MSH-3", 'xyzEMR');
message.setNode("MSH-4", 'xyzEMR');
message.setNode("MSH-5", 'abcEMR');
message.setNode("MSH-6", 'abcEMR');
var dateTime = qie.formatDate("yyyyMMddHHmmss");
message.setNode("MSH-7", dateTime);
message.setNode("MSH-10", dateTime);
message.setNode("EVN-2", dateTime);
message.setNode("MSH-9", 'ADT^A08');
message.setNode("MSH-11", 'P');
message.setNode("MSH-12", '2.3');
message.setNode("MSH-15", 'NE');
message.setNode("MSH-16", 'NE');

// Create EVN Segment
message.setNode("EVN-1", 'A08');
message.createAndSetNode('EVN-6', '');

// Create PID Segment
message.setNode("PID-1", '1');
message.setNode("PID-2", source.getNode("/person/id"));
message.setNode("PID-3", source.getNode("/person/mrn"));
message.setNode("PID-5.1", source.getNode("/person/name/first"));
message.setNode("PID-5.2", source.getNode("/person/name/last"));
var dob = source.getNode("/person/dob");
dob = qie.formatDate("yyyyMMdd", dob);
message.setNode("PID-7", dob);
message.setNode("PID-19", source.getNode("/person/ssn"));
message.createAndSetNode('PID-30', '');
 

This creates a basic HL7 message.  Now we can add logic to loop data and add additional segments as needed, such as OBX segments.

An example mapping to add multiple OBX segments would be:

for (var i = 0; i < 2; i++) {
   // create a new segment
   var obxSegment = qie.parseHL7String('OBX');
   
   // set the segment sequence
   obxSegment.setNode('OBX-1', i+1);
   
   // set other nodes as needed
   obxSegment.setNode('OBX-3', 'MyCode');
   
   // add obxSegment to message
   message.addChild('/', 'OBX', obxSegment);
}

The output HL7 for this code is:

MSH|^~\&|xyzEMR|xyzEMR|abcEMR|abcEMR|20170814221628||ADT^A08|20170814221628|P|2.3|||NE|NE
EVN|A08|20170814221628||||
PID|1|1234|125-54664||Mickey^Mouse||19650704||||||||||||111-22-3333|||||||||||
OBX|1||MyCode
OBX|2||MyCode

answered Aug 15, 2017 by ben-s-7515 (12,320 points)
0 votes

There are two different ways to do this.  In this answer I will give an example of using a template to create the new HL7 message.  For this example, we will use the following JSON message:

{
  "person": {
    "id": "1234",
    "mrn": "125-54664",
    "name": {
      "first": "Mickey",
      "middle": "",
      "last": "Mouse"
    },
    "dob": "1965-07-04",
    "ssn": "111-22-3333",
    "address": {
      "type": "home",
      "street1": "128 Viewcrest Ln",
      "street2": "suite 200",
      "city": "Bondville",
      "state": "CA",
      "zip": "94033"
    }
  }
}

Now we create a new system variable that will be our template.  Note in the template we are using node tags to identify the data that will be used in the template.  In this case I named the variable 'HL7 Template':

MSH|^\&~|xyzEMR|xyzEMR|abcEMR|abcEMR|{SYSTEM_DATE[yyyyMMddHHmmssSSS]}||ADT^A08|{SYSTEM_DATE[yyyyMMddHHmmssSSS]}|P|2.3|||NE|NE|||
EVN|A08|{SYSTEM_DATE[yyyyMMddHHmmssSSS]}||||
PID|1|{m:/person/id}|{m:/person/mrn}||{m:/person/name/first}^{m:/person/name/last}||{mc:dob}||||||||||||{m:/person/ssn}|||||||||||
 

Now in my first mapping node, I will add the following code to load this template and have QIE convert the node tags in the template to the data from the message.

// Cache values that are needed for the template
messageCache.setValue('dob', qie.formatDate('yyyyMMdd', source.getNode('/person/dob')));

// Create new message using template
var hl7Message = qie.evaluateTemplate(qie.getVariable('HL7 Template'));
message = qie.createHL7Message();
message.setNode('/', hl7Message);

Finally we can use a similar method to create the OBX segments and add them to this message.  Or we can do it manually:

for (var i = 0; i < 2; i++) {
   // create a new segment
   var obxSegment = qie.parseHL7String('OBX');
   
   // set the segment sequence
   obxSegment.setNode('OBX-1', i+1);
   
   // set other nodes as needed
   obxSegment.setNode('OBX-3', 'MyCode');
   
   // add obxSegment to message
   message.addChild('/', 'OBX', obxSegment);
}

The output of this message will be:

MSH|^\&~|xyzEMR|xyzEMR|abcEMR|abcEMR|20170814222225485||ADT^A08|20170814222225485|P|2.3|||NE|NE|||
EVN|A08|20170814222225485||||
PID|1|1234|125-54664||Mickey^Mouse||19650704||||||||||||111-22-3333|||||||||||
OBX|1||MyCode
OBX|2||MyCode
 

answered Aug 15, 2017 by ben-s-7515 (12,320 points)
...