Skip to content

Instantly share code, notes, and snippets.

@virtualadrian
Created August 6, 2019 09:55
Show Gist options
  • Save virtualadrian/6828ec0122b6cebeac7c12b300e55da7 to your computer and use it in GitHub Desktop.
Save virtualadrian/6828ec0122b6cebeac7c12b300e55da7 to your computer and use it in GitHub Desktop.
IntelliJ Data Extractor To JSON w. DateFormat
/*
 * Available context bindings:
 *   COLUMNS     List<DataColumn>
 *   ROWS        Iterable<DataRow>
 *   OUT         { append() }
 *   FORMATTER   { format(row, col); formatValue(Object, col) }
 *   TRANSPOSED  Boolean
 * plus ALL_COLUMNS, TABLE, DIALECT
 *
 * where:
 *   DataRow     { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
 *   DataColumn  { columnNumber(), name() }
 */

import java.text.SimpleDateFormat

import static com.intellij.openapi.util.text.StringUtil.escapeStringCharacters as escapeStr

NEWLINE = System.getProperty("line.separator")
INDENT = "  "


static String tryFormatDate(String inDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    try {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
                .format(dateFormat.parse(inDate.trim()))
    } catch (ignored) {
        return inDate;
    }
}

def printJSON(level, col, o) {
    switch (o) {
        case null: OUT.append("null"); break
        case Number: OUT.append(FORMATTER.formatValue(o, col)); break
        case Boolean: OUT.append("$o"); break
        case String: OUT.append("\"${tryFormatDate(escapeStr(o))}\""); break
        case Tuple: printJSON(level, o[0], o[1]); break
        case Map:
            OUT.append("{")
            o.entrySet().eachWithIndex { entry, i ->
                OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
                OUT.append("\"${escapeStr(entry.getKey().toString().uncapitalize())}\"")
                OUT.append(": ")
                printJSON(level + 1, null, entry.getValue())
            }
            OUT.append("$NEWLINE${INDENT * level}}")
            break
        case Object[]:
        case Iterable:
            OUT.append("[")
            def plain = true
            o.eachWithIndex { item, i ->
                plain = item == null || item instanceof Number || item instanceof Boolean || item instanceof String
                if (plain) OUT.append(i > 0 ? ", " : "")
                else OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}")
                printJSON(level + 1, null, item)
            }
            if (plain) OUT.append("]") else OUT.append("$NEWLINE${INDENT * level}]")
            break
        default:
            if (col != null) printJSON(level, null, FORMATTER.formatValue(o, col))
            else OUT.append("$o")
            break
    }
}

printJSON(0, null, ROWS.transform { row ->
    def map = new LinkedHashMap<String, String>()
    COLUMNS.each { col ->
        def val = row.value(col)
        map.put(col.name(), new Tuple(col, val))
    }
    map
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment