in paimon-common/src/main/java/org/apache/paimon/data/variant/GenericVariant.java [400:494]
private static void toJsonImpl(
byte[] value, byte[] metadata, int pos, StringBuilder sb, ZoneId zoneId) {
switch (GenericVariantUtil.getType(value, pos)) {
case OBJECT:
handleObject(
value,
pos,
(size, idSize, offsetSize, idStart, offsetStart, dataStart) -> {
sb.append('{');
for (int i = 0; i < size; ++i) {
int id = readUnsigned(value, idStart + idSize * i, idSize);
int offset =
readUnsigned(
value, offsetStart + offsetSize * i, offsetSize);
int elementPos = dataStart + offset;
if (i != 0) {
sb.append(',');
}
sb.append(escapeJson(getMetadataKey(metadata, id)));
sb.append(':');
toJsonImpl(value, metadata, elementPos, sb, zoneId);
}
sb.append('}');
return null;
});
break;
case ARRAY:
handleArray(
value,
pos,
(size, offsetSize, offsetStart, dataStart) -> {
sb.append('[');
for (int i = 0; i < size; ++i) {
int offset =
readUnsigned(
value, offsetStart + offsetSize * i, offsetSize);
int elementPos = dataStart + offset;
if (i != 0) {
sb.append(',');
}
toJsonImpl(value, metadata, elementPos, sb, zoneId);
}
sb.append(']');
return null;
});
break;
case NULL:
sb.append("null");
break;
case BOOLEAN:
sb.append(GenericVariantUtil.getBoolean(value, pos));
break;
case LONG:
sb.append(GenericVariantUtil.getLong(value, pos));
break;
case STRING:
sb.append(escapeJson(GenericVariantUtil.getString(value, pos)));
break;
case DOUBLE:
sb.append(GenericVariantUtil.getDouble(value, pos));
break;
case DECIMAL:
sb.append(GenericVariantUtil.getDecimal(value, pos).toPlainString());
break;
case DATE:
appendQuoted(
sb,
LocalDate.ofEpochDay((int) GenericVariantUtil.getLong(value, pos))
.toString());
break;
case TIMESTAMP:
appendQuoted(
sb,
TIMESTAMP_FORMATTER.format(
microsToInstant(GenericVariantUtil.getLong(value, pos))
.atZone(zoneId)));
break;
case TIMESTAMP_NTZ:
appendQuoted(
sb,
TIMESTAMP_NTZ_FORMATTER.format(
microsToInstant(GenericVariantUtil.getLong(value, pos))
.atZone(ZoneOffset.UTC)));
break;
case FLOAT:
sb.append(GenericVariantUtil.getFloat(value, pos));
break;
case BINARY:
appendQuoted(
sb,
Base64.getEncoder()
.encodeToString(GenericVariantUtil.getBinary(value, pos)));
break;
}
}