in core/src/main/java/com/jetbrains/youtrackdb/internal/core/serialization/serializer/JSONWriter.java [75:181]
public static String writeValue(
DatabaseSessionInternal db, Object iValue, final String iFormat, final int iIndentLevel,
PropertyTypeInternal valueType)
throws IOException {
if (iValue == null) {
return "null";
}
final var buffer = new StringBuilder(64);
if (iValue instanceof Boolean || iValue instanceof Number) {
if (iValue instanceof Double && !Double.isFinite((Double) iValue)) {
buffer.append("null");
} else if ((iValue instanceof Float && !Float.isFinite((Float) iValue))) {
buffer.append("null");
} else {
buffer.append(iValue);
}
} else if (iValue instanceof Identifiable linked) {
if (((RecordIdInternal) linked.getIdentity()).isValidPosition()) {
buffer.append('\"');
((RecordIdInternal) linked.getIdentity()).toString(buffer);
buffer.append('\"');
} else {
if (iFormat != null && iFormat.contains("shallow")) {
buffer.append("{}");
} else {
try {
var transaction = db.getActiveTransaction();
var rec = transaction.load(linked);
final var embeddedFormat =
iFormat != null && iFormat.isEmpty()
? "indent:" + iIndentLevel
: iFormat + ",indent:" + iIndentLevel;
buffer.append(rec.toJSON(embeddedFormat));
} catch (RecordNotFoundException e) {
buffer.append("null");
}
}
}
} else if (iValue.getClass().isArray()) {
if (iValue instanceof byte[] source) {
buffer.append('\"');
if (iFormat != null && iFormat.contains("shallow")) {
buffer.append(source.length);
} else {
buffer.append(Base64.getEncoder().encodeToString(source));
}
buffer.append('\"');
} else {
buffer.append('[');
var size = Array.getLength(iValue);
if (iFormat != null && iFormat.contains("shallow")) {
buffer.append(size);
} else {
for (var i = 0; i < size; ++i) {
if (i > 0) {
buffer.append(",");
}
buffer.append(writeValue(db, Array.get(iValue, i), iFormat));
}
}
buffer.append(']');
}
} else if (iValue instanceof Iterator<?>) {
iteratorToJSON(db, (Iterator<?>) iValue, iFormat, buffer);
} else if (iValue instanceof Iterable<?>) {
iteratorToJSON(db, ((Iterable<?>) iValue).iterator(), iFormat, buffer);
} else if (iValue instanceof Map<?, ?>) {
mapToJSON(db, (Map<Object, Object>) iValue, iFormat, buffer);
} else if (iValue instanceof Map.Entry<?, ?> entry) {
buffer.append('{');
buffer.append(writeValue(db, entry.getKey(), iFormat));
buffer.append(":");
if (iFormat.contains("prettyPrint")) {
buffer.append(' ');
}
buffer.append(writeValue(db, entry.getValue(), iFormat));
buffer.append('}');
} else if (iValue instanceof Date) {
if (iFormat.indexOf("dateAsLong") > -1) {
buffer.append(((Date) iValue).getTime());
} else {
buffer.append('"');
buffer.append(DateHelper.getDateTimeFormatInstance(db).format(iValue));
buffer.append('"');
}
} else if (iValue instanceof BigDecimal) {
buffer.append(((BigDecimal) iValue).toPlainString());
} else if (iValue instanceof Iterable<?>) {
iteratorToJSON(db, ((Iterable<?>) iValue).iterator(), iFormat, buffer);
} else {
// TREAT IT AS STRING
final var v = iValue.toString();
buffer.append('"');
buffer.append(encode(v));
buffer.append('"');
}
return buffer.toString();
}