private static void toJsonImpl()

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