
public class TableDemo {
public static void main(String[] args) {
String headersJson = "[\n" +
" {\n" +
" \"columnDescription\": \"航name\",\n" +
" \"columnName\": \"name\",\n" +
" },\n" +
" {\n" +
" \"columnDescription\": \"航id\\n\",\n" +
" \"columnName\": \"id\",\n" +
" }\n" +
" ]";
String rowsJson = "[\n" +
" {\n" +
" \"name\": \"sc2\",\n" +
" \"id\": \"1\"\n" +
" \n" +
" },\n" +
" {\n" +
" \"name\": \"sc1\",\n" +
" \"id\": \"2\"\n" +
" }\n" +
"]";
JSONArray tableHeaders = JSONArray.parseArray(headersJson);
List<Map<String, Object>> tableRows = JSON.parseObject(rowsJson, new TypeReference<List<Map<String, Object>>>(){});
String markdownTable = generateDbMarkdownTable(tableHeaders, tableRows);
System.out.println(markdownTable);
}
private static final String HEADER_SEPARATOR = "|";
private static final String CELL_SEPARATOR = "|";
private static String generateDbMarkdownTable(JSONArray tableHeaders, List<Map<String, Object>> tableRows) {
List<JSONObject> headerList = tableHeaders.stream().map(tableHeader -> (JSONObject) tableHeader)
.collect(Collectors.toList());
String headerRow = headerList.stream()
.map(header -> sanitizeHeader(header.getString("columnDescription")))
.collect(Collectors.joining(" " + CELL_SEPARATOR + " ", HEADER_SEPARATOR + " ", " " + HEADER_SEPARATOR + "\n"));
String separatorLine = headerList.stream()
.map(header -> repeatString("-", Math.max(3, sanitizeHeader(header.getString("columnDescription")).length())))
.collect(Collectors.joining(" " + CELL_SEPARATOR + " ", HEADER_SEPARATOR + " ", " " + HEADER_SEPARATOR + "\n"));
StringBuilder markdownTable = new StringBuilder(headerRow).append(separatorLine);
for (Map<String, Object> row : tableRows) {
String rowLine = headerList.stream()
.map(header -> formatCellValue(row.get(header.getString("columnName"))))
.collect(Collectors.joining(" " + CELL_SEPARATOR + " ", HEADER_SEPARATOR + " ", " " + HEADER_SEPARATOR + "\n"));
markdownTable.append(rowLine);
}
return markdownTable.toString();
}
private static String sanitizeHeader(String header) {
return header.replace("\n", " ").replaceAll("\\s+", " ").trim();
}
private static String repeatString(String str, int count) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
sb.append(str);
}
return sb.toString();
}
private static String formatCellValue(Object value) {
if (value == null) {
return "";
} else if (value instanceof String && isJson((String) value)) {
return formatJsonString((String) value);
} else {
return escapeMarkdown(value.toString());
}
}
private static String formatJsonString(String jsonString) {
return escapeMarkdown(jsonString.replace("\n", "").replace("\"", "\\\""));
}
private static String escapeMarkdown(String value) {
return value.replace("|", "\\|");
}
private static boolean isJson(String value) {
try {
JSON.parse(value);
return true;
} catch (Exception e) {
return false;
}
}
}