Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created March 13, 2026 11:05
Show Gist options
  • Select an option

  • Save sunmeat/890e657066bf0db62eb68e30faa881b6 to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/890e657066bf0db62eb68e30faa881b6 to your computer and use it in GitHub Desktop.
кастомний джейсон серіалізатор
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Program {
public static void main(String[] args) {
Map<String, Object> person = new LinkedHashMap<>();
person.put("name", "Олег");
person.put("age", 28);
person.put("isStudent", false);
person.put("grades", List.of(12, 12, 11, 12));
Map<String, Object> address = new LinkedHashMap<>();
address.put("city", "Одеса");
address.put("street", "вул. Дерибасівська");
address.put("zip", "65005");
person.put("address", address);
// серіалізація в JSON-рядок
String json = toJson(person);
System.out.println(json);
}
// кастомний перетворювач об'єкта в JSON-рядок
// підтримує: String, Number, Boolean, null, List, Map
public static String toJson(Object obj) {
if (obj == null) {
return "null";
}
if (obj instanceof String) {
return "\"" + escapeJsonString((String) obj) + "\"";
}
if (obj instanceof Number || obj instanceof Boolean) {
return obj.toString();
}
if (obj instanceof List<?> list) {
var sb = new StringBuilder("[");
for (int i = 0; i < list.size(); i++) {
if (i > 0) sb.append(",");
sb.append(toJson(list.get(i)));
}
sb.append("]");
return sb.toString();
}
if (obj instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) obj;
StringBuilder sb = new StringBuilder("{");
boolean first = true;
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (!first) sb.append(",");
first = false;
sb.append(toJson(entry.getKey()))
.append(":")
.append(toJson(entry.getValue()));
}
sb.append("}");
return sb.toString();
}
// якщо тип не підтримується - можна кинути виняток або повернути toString
throw new IllegalArgumentException("Тип не підтримується: " + obj.getClass().getName());
}
private static String escapeJsonString(String s) {
if (s == null) return "";
var sb = new StringBuilder();
for (char c : s.toCharArray()) {
switch (c) {
case '"': sb.append("\\\""); break;
case '\\': sb.append("\\\\"); break;
case '\b': sb.append("\\b"); break;
case '\f': sb.append("\\f"); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\t': sb.append("\\t"); break;
default:
if (c <= 0x1F) {
sb.append(String.format("\\u%04x", (int) c));
} else {
sb.append(c);
}
}
}
return sb.toString();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment