JSON.stringify with mapped variables


There are times when I want to create a data structure in Mirth, and output the contents of that data structure while debugging the code. Luckily, JSON.stringify() is available not only in modern browsers but also in Mirth.

var o = {
  mrn: '8675309',
  labs: [
    'blood bank',
    'microbiology',
    'toxicology'
  ]
};

console.log(JSON.stringify(o, null, '\t'));

However, there are any types of Mirth mapped variables, the JSON.stringify() method blows up on itself with a message similar to

DETAILS:    Java class "[B" has no public instance field or method named "toJSON".

This is how we fix it.

Consider the following code. Assume that a variable has been mapped to mrn using Mirth’s mapper transformer or a call to channelMap.put(). This code explodes with the aforementioned error.

var o = {
  mrn: $('mrn'),
  labs: [
    'blood bank',
    'microbiology',
      'toxicology'
  ]
};

Oddly, if we call logger.error($('mrn')), the mapped variable shows up correctly. Our assumption is that $('mrn') would return a string if the mapped variable was in fact a string (as opposed to a javascript object, for example). However, if we then call logger.error(typeof $('mrn')), we get “object.” This should be our first clue that not all is what it seems.

Since I am not a Java programmer, I searched the internet trying to find what [B represents. I’ve found that [B is some kind of a byte array in Java, and thus Mirth or maybe even Rhino implements a mapped variable as a byte array. When JSON.stringify() is called on our data structure, toJSON() is called on each individual element in the structure… since the Java byte array [B does not implement toJSON(), an exception is thrown.

So, our goal is to convert the [B object into a javascript string since a javascript string does implement the toJSON() method. My original instinct was to simply called toString() on the mapped variable, but that failed similarly.

I eventually found that explicitly constructing a javascript string with the new keyword would get the job done. This is the working code for printing a data structure with a mapped variable.

var o = {
  mrn: new String($('mrn')),
  labs: [
    'blood bank',
    'microbiology',
    'toxicology'
  ]
};

logger.error(JSON.stringify(o, null, '\t'));

See also