import java.util.HashMap;
import java.util.Map;
public class ApiPayloadParser {
/**
* Parses API payload arguments with defensive checks.
* @param payload A map representing the API payload.
* @param expectedKeys A map of expected keys and their data types.
* @return A map containing the parsed arguments, or null if parsing fails.
*/
public static Map<String, Object> parsePayload(Map<String, String> payload, Map<String, Class<?>> expectedKeys) {
Map<String, Object> parsedPayload = new HashMap<>();
if (payload == null || expectedKeys == null) {
System.err.println("Error: Payload or expected keys are null.");
return null;
}
for (Map.Entry<String, Class<?>> entry : expectedKeys.entrySet()) {
String key = entry.getKey();
Class<?> expectedType = entry.getValue();
if (!payload.containsKey(key)) {
System.err.println("Error: Missing key: " + key);
return null;
}
String value = payload.get(key);
try {
Object parsedValue = parseValue(value, expectedType);
parsedPayload.put(key, parsedValue);
} catch (IllegalArgumentException e) {
System.err.println("Error: Invalid value for key '" + key + "': " + e.getMessage());
return null;
} catch (Exception e) {
System.err.println("Error: Unexpected error parsing key '" + key + "': " + e.getMessage());
return null;
}
}
return parsedPayload;
}
/**
* Parses a string value into the expected data type.
* @param value The string value to parse.
* @param type The expected data type.
* @return The parsed value.
* @throws IllegalArgumentException if the value cannot be parsed.
*/
private static Object parseValue(String value, Class<?> type) throws IllegalArgumentException {
if (value == null || value.isEmpty()) {
return null; // Or handle null/empty values as needed
}
if (type == String.class) {
return value;
} else if (type == Integer.class) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid integer value: " + value, e);
}
} else if (type == Double.class) {
try {
return Double.parseDouble(value);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid double value: " + value, e);
}
} else if (type == Boolean.class) {
return Boolean.parseBoolean(value.toLowerCase());
} else if (type == Long.class) {
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid long value: " + value, e);
}
}
else {
return value; //Return as String if type not supported
}
}
public static void main(String[] args) {
// Example Usage
Map<String, String> payload = new HashMap<>();
payload.put("name", "John Doe");
payload.put("age", "30");
payload.put("height", "1.75");
payload.put("isActive", "true");
Map<String, Class<?>> expectedKeys = new HashMap<>();
expectedKeys.put("name", String.class);
expectedKeys.put("age", Integer.class);
expectedKeys.put("height", Double.class);
expectedKeys.put("isActive", Boolean.class);
Map<String, Object> parsedPayload = parsePayload(payload, expectedKeys);
if (parsedPayload != null) {
System.out.println("Parsed Payload: " + parsedPayload);
}
//Example with missing key
Map<String, String> payload2 = new HashMap<>();
payload2.put("name", "Jane Doe");
Map<String, Class<?>> expectedKeys2 = new HashMap<>();
expectedKeys2.put("name", String.class);
Add your comment