public static Object fromJson()

in core/src/main/java/org/apache/iceberg/SingleValueParser.java [49:172]


  public static Object fromJson(Type type, JsonNode defaultValue) {
    if (defaultValue == null || defaultValue.isNull()) {
      return null;
    }

    switch (type.typeId()) {
      case BOOLEAN:
        Preconditions.checkArgument(
            defaultValue.isBoolean(), "Cannot parse default as a %s value: %s", type, defaultValue);
        return defaultValue.booleanValue();
      case INTEGER:
        Preconditions.checkArgument(
            defaultValue.isIntegralNumber() && defaultValue.canConvertToInt(),
            "Cannot parse default as a %s value: %s",
            type,
            defaultValue);
        return defaultValue.intValue();
      case LONG:
        Preconditions.checkArgument(
            defaultValue.isIntegralNumber() && defaultValue.canConvertToLong(),
            "Cannot parse default as a %s value: %s",
            type,
            defaultValue);
        return defaultValue.longValue();
      case FLOAT:
        Preconditions.checkArgument(
            defaultValue.isFloatingPointNumber(),
            "Cannot parse default as a %s value: %s",
            type,
            defaultValue);
        return defaultValue.floatValue();
      case DOUBLE:
        Preconditions.checkArgument(
            defaultValue.isFloatingPointNumber(),
            "Cannot parse default as a %s value: %s",
            type,
            defaultValue);
        return defaultValue.doubleValue();
      case DECIMAL:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        BigDecimal retDecimal;
        try {
          retDecimal = new BigDecimal(defaultValue.textValue());
        } catch (NumberFormatException e) {
          throw new IllegalArgumentException(
              String.format("Cannot parse default as a %s value: %s", type, defaultValue), e);
        }
        Preconditions.checkArgument(
            retDecimal.scale() == ((Types.DecimalType) type).scale(),
            "Cannot parse default as a %s value: %s, the scale doesn't match",
            type,
            defaultValue);
        return retDecimal;
      case STRING:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        return defaultValue.textValue();
      case UUID:
        Preconditions.checkArgument(
            defaultValue.isTextual() && defaultValue.textValue().length() == 36,
            "Cannot parse default as a %s value: %s",
            type,
            defaultValue);
        UUID uuid;
        try {
          uuid = UUID.fromString(defaultValue.textValue());
        } catch (IllegalArgumentException e) {
          throw new IllegalArgumentException(
              String.format("Cannot parse default as a %s value: %s", type, defaultValue), e);
        }
        return uuid;
      case DATE:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        return DateTimeUtil.isoDateToDays(defaultValue.textValue());
      case TIME:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        return DateTimeUtil.isoTimeToMicros(defaultValue.textValue());
      case TIMESTAMP:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        if (((Types.TimestampType) type).shouldAdjustToUTC()) {
          String timestampTz = defaultValue.textValue();
          Preconditions.checkArgument(
              DateTimeUtil.isUTCTimestamptz(timestampTz),
              "Cannot parse default as a %s value: %s, offset must be +00:00",
              type,
              defaultValue);
          return DateTimeUtil.isoTimestamptzToMicros(timestampTz);
        } else {
          return DateTimeUtil.isoTimestampToMicros(defaultValue.textValue());
        }
      case FIXED:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        int defaultLength = defaultValue.textValue().length();
        int fixedLength = ((Types.FixedType) type).length();
        Preconditions.checkArgument(
            defaultLength == fixedLength * 2,
            "Cannot parse default %s value: %s, incorrect length: %s",
            type,
            defaultValue,
            defaultLength);
        byte[] fixedBytes =
            BaseEncoding.base16().decode(defaultValue.textValue().toUpperCase(Locale.ROOT));
        return ByteBuffer.wrap(fixedBytes);
      case BINARY:
        Preconditions.checkArgument(
            defaultValue.isTextual(), "Cannot parse default as a %s value: %s", type, defaultValue);
        byte[] binaryBytes =
            BaseEncoding.base16().decode(defaultValue.textValue().toUpperCase(Locale.ROOT));
        return ByteBuffer.wrap(binaryBytes);
      case LIST:
        return listFromJson(type, defaultValue);
      case MAP:
        return mapFromJson(type, defaultValue);
      case STRUCT:
        return structFromJson(type, defaultValue);
      default:
        throw new UnsupportedOperationException(String.format("Type: %s is not supported", type));
    }
  }