public static void toJson()

in core/src/main/java/org/apache/iceberg/SingleValueParser.java [240:393]


  public static void toJson(Type type, Object defaultValue, JsonGenerator generator)
      throws IOException {
    if (defaultValue == null) {
      generator.writeNull();
      return;
    }

    switch (type.typeId()) {
      case BOOLEAN:
        Preconditions.checkArgument(
            defaultValue instanceof Boolean, "Invalid default %s value: %s", type, defaultValue);
        generator.writeBoolean((Boolean) defaultValue);
        break;
      case INTEGER:
        Preconditions.checkArgument(
            defaultValue instanceof Integer, "Invalid default %s value: %s", type, defaultValue);
        generator.writeNumber((Integer) defaultValue);
        break;
      case LONG:
        Preconditions.checkArgument(
            defaultValue instanceof Long, "Invalid default %s value: %s", type, defaultValue);
        generator.writeNumber((Long) defaultValue);
        break;
      case FLOAT:
        Preconditions.checkArgument(
            defaultValue instanceof Float, "Invalid default %s value: %s", type, defaultValue);
        generator.writeNumber((Float) defaultValue);
        break;
      case DOUBLE:
        Preconditions.checkArgument(
            defaultValue instanceof Double, "Invalid default %s value: %s", type, defaultValue);
        generator.writeNumber((Double) defaultValue);
        break;
      case DATE:
        Preconditions.checkArgument(
            defaultValue instanceof Integer, "Invalid default %s value: %s", type, defaultValue);
        generator.writeString(DateTimeUtil.daysToIsoDate((Integer) defaultValue));
        break;
      case TIME:
        Preconditions.checkArgument(
            defaultValue instanceof Long, "Invalid default %s value: %s", type, defaultValue);
        generator.writeString(DateTimeUtil.microsToIsoTime((Long) defaultValue));
        break;
      case TIMESTAMP:
        Preconditions.checkArgument(
            defaultValue instanceof Long, "Invalid default %s value: %s", type, defaultValue);
        if (((Types.TimestampType) type).shouldAdjustToUTC()) {
          generator.writeString(DateTimeUtil.microsToIsoTimestamptz((Long) defaultValue));
        } else {
          generator.writeString(DateTimeUtil.microsToIsoTimestamp((Long) defaultValue));
        }
        break;
      case STRING:
        Preconditions.checkArgument(
            defaultValue instanceof CharSequence,
            "Invalid default %s value: %s",
            type,
            defaultValue);
        generator.writeString(((CharSequence) defaultValue).toString());
        break;
      case UUID:
        Preconditions.checkArgument(
            defaultValue instanceof UUID, "Invalid default %s value: %s", type, defaultValue);
        generator.writeString(defaultValue.toString());
        break;
      case FIXED:
        Preconditions.checkArgument(
            defaultValue instanceof ByteBuffer, "Invalid default %s value: %s", type, defaultValue);
        ByteBuffer byteBufferValue = (ByteBuffer) defaultValue;
        int expectedLength = ((Types.FixedType) type).length();
        Preconditions.checkArgument(
            byteBufferValue.remaining() == expectedLength,
            "Invalid default %s value, incorrect length: %s",
            type,
            byteBufferValue.remaining());
        generator.writeString(
            BaseEncoding.base16().encode(ByteBuffers.toByteArray(byteBufferValue)));
        break;
      case BINARY:
        Preconditions.checkArgument(
            defaultValue instanceof ByteBuffer, "Invalid default %s value: %s", type, defaultValue);
        generator.writeString(
            BaseEncoding.base16().encode(ByteBuffers.toByteArray((ByteBuffer) defaultValue)));
        break;
      case DECIMAL:
        Preconditions.checkArgument(
            defaultValue instanceof BigDecimal
                && ((BigDecimal) defaultValue).scale() == ((Types.DecimalType) type).scale(),
            "Invalid default %s value: %s",
            type,
            defaultValue);
        BigDecimal decimalValue = (BigDecimal) defaultValue;
        if (decimalValue.scale() >= 0) {
          generator.writeString(decimalValue.toPlainString());
        } else {
          generator.writeString(decimalValue.toString());
        }
        break;
      case LIST:
        Preconditions.checkArgument(
            defaultValue instanceof List, "Invalid default %s value: %s", type, defaultValue);
        List<Object> defaultList = (List<Object>) defaultValue;
        Type elementType = type.asListType().elementType();
        generator.writeStartArray();
        for (Object element : defaultList) {
          toJson(elementType, element, generator);
        }
        generator.writeEndArray();
        break;
      case MAP:
        Preconditions.checkArgument(
            defaultValue instanceof Map, "Invalid default %s value: %s", type, defaultValue);
        Map<Object, Object> defaultMap = (Map<Object, Object>) defaultValue;
        Type keyType = type.asMapType().keyType();
        Type valueType = type.asMapType().valueType();

        List<Object> valueList = Lists.newArrayListWithExpectedSize(defaultMap.size());
        generator.writeStartObject();
        generator.writeArrayFieldStart(KEYS);
        for (Map.Entry<Object, Object> entry : defaultMap.entrySet()) {
          toJson(keyType, entry.getKey(), generator);
          valueList.add(entry.getValue());
        }
        generator.writeEndArray();
        generator.writeArrayFieldStart(VALUES);
        for (Object value : valueList) {
          toJson(valueType, value, generator);
        }
        generator.writeEndArray();
        generator.writeEndObject();
        break;
      case STRUCT:
        Preconditions.checkArgument(
            defaultValue instanceof StructLike, "Invalid default %s value: %s", type, defaultValue);
        Types.StructType structType = type.asStructType();
        List<Types.NestedField> fields = structType.fields();
        StructLike defaultStruct = (StructLike) defaultValue;

        generator.writeStartObject();
        for (int i = 0; i < defaultStruct.size(); i++) {
          Types.NestedField field = fields.get(i);
          int fieldId = field.fieldId();
          Object fieldDefaultValue = defaultStruct.get(i, Object.class);
          if (fieldDefaultValue != null) {
            generator.writeFieldName(String.valueOf(fieldId));
            toJson(field.type(), fieldDefaultValue, generator);
          }
        }
        generator.writeEndObject();
        break;
      default:
        throw new UnsupportedOperationException(String.format("Type: %s is not supported", type));
    }
  }