Monday, November 7, 2016

Converting an ADT HL7 message to JSON

If anyone has ever had the pleasure of working the HL7 ADT messages in to exchange information between healthcare systems, you'll know the frustration of trying to actually using that information in a meaningful way (i.e. trying to work with it without having to read 200 pages of documentation to understand what the different segments of an HL7 message are).

Although the HL7 standard makes it less verbose when sending the information along, I prefer working with JSON objects as opposed to pipe delimited strings. If you are in the same boat, then you can use the following two python functions to convert an HL7 message to an easier to digest/understand. (Note these two functsion depend on the hl7apy python library)

Yes, these functions return a python dictionary and not a JSON object, but you can trivially convert a dictionary to a JSON string.
import json

from hl7apy.parser import parse_message

# Taken from
s = """MSH|^~\&|GHH_ADT||||20080115153000||ADT^A01^ADT_A01|0123456789|P|2.5||||AL
PID|1||566-554-3423^^^GHH^MR||EVERYMAN^ADAM^A|||M|||2222 HOME STREET^^ANN ARBOR^MI^^USA||555-555-2004~444-333-222|||M

# Convert it
d = hl7_str_to_dict(s)

# Dump it as a JSON string
print json.dumps(d)
Hope this helps someone who appreciates new data representations more than old data representations ;)


  1. Any idea what'd cause this when scanning in a file:

    AttributeError: 'NoneType' object has no attribute 'lower'

    When I scanned in your string (without """) it worked.

    1. Had to put str( on line 46

    2. Thanks for the find! I've updated the gist.

  2. Thanks for writing this. Do you have any code for going back to SIU message?

    1. Unfortunately, I only wrote it going one way. If you write it, I'd love to see it!

  3. My only suggestion tool is that mirth connect which convert any hl7 messages like ADT or scheduling segment and for laboratories segment easily to any format like json, MySQL, xml etc..