package org.example; import java.io.StringWriter; import java.io.Writer; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.json.Json; import javax.json.stream.JsonGenerator; class EJsonWriter { public static String write(Object object) { StringWriter writer = new StringWriter(200); write(object, writer); return writer.toString(); } public static void write(Object object, Writer writer) { JsonGenerator generator = Json.createGenerator(writer); write(object, generator); generator.close(); } public static void write(Object object, JsonGenerator jsonGenerator) { new EJsonWriter(jsonGenerator).writeJson(object); } private final JsonGenerator jsonGenerator; private EJsonWriter(JsonGenerator jsonGenerator) { this.jsonGenerator = jsonGenerator; } private void writeJson(Object object) { writeJson(null, object); } @SuppressWarnings("unchecked") private void writeJson(String name, Object object) { if (object == null) { writeNull(name); } else if (object instanceof Map) { writeMap(name, (Map<Object, Object>) object); } else if (object instanceof Collection) { writeCollection(name, (Collection<Object>) object); } else if (object instanceof Boolean) { writeBoolean(name, (Boolean) object); } else if (object instanceof Number) { writeNumber(name, (Number) object); } else if (object instanceof Date) { writeDate(name, (Date) object); } else if (object instanceof String) { writeString(name, (String) object); } else { writeString(name, object.toString()); } } private void writeBoolean(String name, Boolean object) { if (name == null) { jsonGenerator.write(object); } else { jsonGenerator.write(name, object); } } private void writeDate(String name, Date object) { if (name == null) { jsonGenerator.write(object.getTime()); } else { jsonGenerator.write(name, object.getTime()); } } private void writeNumber(String name, Number object) { if (object instanceof Long) { writeLong(name, object); } else if (object instanceof Integer) { writeInteger(name, object); } else if (object instanceof Double) { writeDouble(name, object); } else if (object instanceof BigDecimal) { writeBigDecimal(name, object); } else if (object instanceof BigInteger) { writeBigInteger(name, object); } else { writeGeneralNumber(name, object); } } private void writeGeneralNumber(String name, Number object) { if (name == null) { jsonGenerator.write(new BigDecimal(object.toString())); } else { jsonGenerator.write(name, new BigDecimal(object.toString())); } } private void writeBigDecimal(String name, Number object) { if (name == null) { jsonGenerator.write((BigDecimal) object); } else { jsonGenerator.write(name, (BigDecimal) object); } } private void writeBigInteger(String name, Number object) { if (name == null) { jsonGenerator.write((BigInteger) object); } else { jsonGenerator.write(name, (BigInteger) object); } } private void writeDouble(String name, Number object) { if (name == null) { jsonGenerator.write((Double) object); } else { jsonGenerator.write(name, (Double) object); } } private void writeLong(String name, Number object) { if (name == null) { jsonGenerator.write((Long) object); } else { jsonGenerator.write(name, (Long) object); } } private void writeInteger(String name, Number object) { if (name == null) { jsonGenerator.write((Integer) object); } else { jsonGenerator.write(name, (Integer) object); } } private void writeNull(String name) { if (name == null) { jsonGenerator.writeNull(); } else { jsonGenerator.writeNull(name); } } private void writeString(String name, String object) { if (name == null) { jsonGenerator.write(object); } else { jsonGenerator.write(name, object); } } private void writeCollection(String name, Collection<Object> collection) { if (name == null) { jsonGenerator.writeStartObject(); } else { jsonGenerator.writeStartArray(name); } for (Object object : collection) { writeJson(null, object); } jsonGenerator.writeEnd(); } private void writeMap(String name, Map<Object, Object> map) { if (name == null) { jsonGenerator.writeStartObject(); } else { jsonGenerator.writeStartObject(name); } Set<Entry<Object, Object>> entrySet = map.entrySet(); for (Entry<Object, Object> entry : entrySet) { writeJson(entry.getKey().toString(), entry.getValue()); } jsonGenerator.writeEnd(); } }