package com.seconectai.condocontab.util; import java.time.temporal.TemporalAccessor; import java.util.Iterator; import java.util.Map; public final class Json { private Json() { } public static String write(Object value) { return value(value); } private static String value(Object value) { if (value == null) { return "null"; } if (value instanceof Number || value instanceof Boolean) { return String.valueOf(value); } if (value instanceof TemporalAccessor) { return quote(String.valueOf(value)); } if (value instanceof Map map) { StringBuilder json = new StringBuilder("{"); Iterator> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); json.append(quote(String.valueOf(entry.getKey()))).append(":").append(value(entry.getValue())); if (iterator.hasNext()) { json.append(","); } } return json.append("}").toString(); } if (value instanceof Iterable iterable) { StringBuilder json = new StringBuilder("["); Iterator iterator = iterable.iterator(); while (iterator.hasNext()) { json.append(value(iterator.next())); if (iterator.hasNext()) { json.append(","); } } return json.append("]").toString(); } return quote(String.valueOf(value)); } private static String quote(String text) { StringBuilder out = new StringBuilder("\""); for (char c : text.toCharArray()) { switch (c) { case '"' -> out.append("\\\""); case '\\' -> out.append("\\\\"); case '\n' -> out.append("\\n"); case '\r' -> out.append("\\r"); case '\t' -> out.append("\\t"); default -> out.append(c); } } return out.append("\"").toString(); } }