Object parseDynamoDBValue()

in tools/dynamodb-bigtable-migration/src/main/java/com/google/cloud/pso/migration/utils/DynamoRowUtils.java [102:188]


  Object parseDynamoDBValue(JsonObject value) {
    try {
      String typeKey = value.keySet().iterator().next();
      JsonElement actualValue = value.get(typeKey);

      switch (typeKey) {
        case "S": // String
          return actualValue.getAsString();

        case "N": // Number
          String numStr = actualValue.getAsString();
          try {
            if (numStr.contains(".")) {
              return new BigDecimal(numStr);
            }
            return Long.parseLong(numStr);
          } catch (NumberFormatException e) {
            throw new RuntimeException("Invalid number format: " + numStr, e);
          }

        case "B": // Binary
          String binStr = actualValue.getAsString();
          return Base64.getEncoder().encodeToString(binStr.getBytes());

        case "BOOL": // Boolean
          return actualValue.getAsBoolean();

        case "NULL": // Null
          return null;

        case "M": // Map
          Map<String, Object> map = new HashMap<>();
          JsonObject mapObj = actualValue.getAsJsonObject();
          for (Map.Entry<String, JsonElement> entry : mapObj.entrySet()) {
            map.put(entry.getKey(), parseDynamoDBValue(entry.getValue().getAsJsonObject()));
          }
          return map;

        case "L": // List
          List<Object> list = new ArrayList<>();
          JsonArray array = actualValue.getAsJsonArray();
          for (JsonElement element : array) {
            list.add(parseDynamoDBValue(element.getAsJsonObject()));
          }
          return list;

        case "SS": // String Set
          Set<String> stringSet = new HashSet<>();
          JsonArray ssArray = actualValue.getAsJsonArray();
          for (JsonElement element : ssArray) {
            stringSet.add(element.getAsString());
          }
          return new ArrayList<>(stringSet);

        case "NS": // Number Set
          Set<Number> numberSet = new HashSet<>();
          JsonArray nsArray = actualValue.getAsJsonArray();
          for (JsonElement element : nsArray) {
            String num = element.getAsString();
            try {
              if (num.contains(".")) {
                numberSet.add(new BigDecimal(num));
              } else {
                numberSet.add(Long.parseLong(num));
              }
            } catch (NumberFormatException e) {
              throw new RuntimeException("Invalid number in number set: " + num, e);
            }
          }
          return new ArrayList<>(numberSet);

        case "BS": // Binary Set
          Set<String> binarySet = new HashSet<>();
          JsonArray bsArray = actualValue.getAsJsonArray();
          for (JsonElement element : bsArray) {
            String binData = element.getAsString();
            binarySet.add(Base64.getEncoder().encodeToString(binData.getBytes()));
          }
          return new ArrayList<>(binarySet);

        default:
          throw new IllegalArgumentException("Unknown DynamoDB type: " + typeKey);
      }
    } catch (Exception e) {
      throw new RuntimeException("Unable to parse DynamoDB value: " + e.getMessage(), e);
    }
  }