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