public static String writeValue()

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();
  }