component { public any function init() { var osName = createObject( 'java', 'java.lang.System' ).getProperty( 'os.name' ); variables.defaultLineEnding = osName.findNoCase( 'windows' ) ? chr( 13 ) & chr( 10 ) : chr( 10 ); variables.defaultIndent = ' '; return this; } public string function formatJson( required any json, string indent = defaultIndent, string lineEnding = defaultLineEnding, boolean spaceAfterColon = false, boolean sortKeys = false ) { if ( isSimpleValue( json ) ) { json = deserializeJSON( json ); } var settings = { indent: indent, lineEnding: lineEnding, colon: spaceAfterColon ? ': ' : ':', sortKeys: sortKeys }; var stringbuilder = createObject( 'java', 'java.lang.StringBuilder' ).init( '' ); return printString( stringbuilder, json, settings ).toString(); } private string function printString( stringbuilder, json, settings, baseIndent = '' ) { if ( isStruct( json ) ) { if ( structIsEmpty( json ) ) { return stringbuilder.append( '{}' ); } stringbuilder.append( '{' ).append( settings.lineEnding ); var keys = json.keyArray(); if ( settings.sortKeys ) { keys.sort( 'text' ); } var separator = ''; for ( var key in keys ) { stringbuilder.append( separator ) .append( baseIndent ) .append( settings.indent ) .append( '"#key#"' ) .append( settings.colon ); if ( isNull( json[ key ] ) ) { stringbuilder.append( 'null' ); } else { printString( stringbuilder, json[ key ], settings, baseIndent & settings.indent ) } separator = ',' & settings.lineEnding; } stringbuilder.append( settings.lineEnding ) .append( baseIndent ) .append( '}' ); return stringbuilder; } if ( isArray( json ) ) { if ( arrayIsEmpty( json ) ) { return stringbuilder.append( '[]' ); } stringbuilder.append( '[' ).append( settings.lineEnding ); var separator = ''; for ( var item in json ) { stringbuilder.append( separator ) .append( baseIndent ) .append( settings.indent ); if ( isNull( item ) ) { stringbuilder.append( 'null' ); } else { printString( stringbuilder, item, settings, baseIndent & settings.indent ) } separator = ',' & settings.lineEnding; } stringbuilder.append( settings.lineEnding ) .append( baseIndent ) .append( ']' ); return stringbuilder; } /* Simple types don't require any special formatting so we can let serializeJSON convert them to JSON for us. */ return stringbuilder.append( serializeJSON( json ) ); } }