1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class ApiPayloadParser {
  4. /**
  5. * Parses API payload arguments with defensive checks.
  6. * @param payload A map representing the API payload.
  7. * @param expectedKeys A map of expected keys and their data types.
  8. * @return A map containing the parsed arguments, or null if parsing fails.
  9. */
  10. public static Map<String, Object> parsePayload(Map<String, String> payload, Map<String, Class<?>> expectedKeys) {
  11. Map<String, Object> parsedPayload = new HashMap<>();
  12. if (payload == null || expectedKeys == null) {
  13. System.err.println("Error: Payload or expected keys are null.");
  14. return null;
  15. }
  16. for (Map.Entry<String, Class<?>> entry : expectedKeys.entrySet()) {
  17. String key = entry.getKey();
  18. Class<?> expectedType = entry.getValue();
  19. if (!payload.containsKey(key)) {
  20. System.err.println("Error: Missing key: " + key);
  21. return null;
  22. }
  23. String value = payload.get(key);
  24. try {
  25. Object parsedValue = parseValue(value, expectedType);
  26. parsedPayload.put(key, parsedValue);
  27. } catch (IllegalArgumentException e) {
  28. System.err.println("Error: Invalid value for key '" + key + "': " + e.getMessage());
  29. return null;
  30. } catch (Exception e) {
  31. System.err.println("Error: Unexpected error parsing key '" + key + "': " + e.getMessage());
  32. return null;
  33. }
  34. }
  35. return parsedPayload;
  36. }
  37. /**
  38. * Parses a string value into the expected data type.
  39. * @param value The string value to parse.
  40. * @param type The expected data type.
  41. * @return The parsed value.
  42. * @throws IllegalArgumentException if the value cannot be parsed.
  43. */
  44. private static Object parseValue(String value, Class<?> type) throws IllegalArgumentException {
  45. if (value == null || value.isEmpty()) {
  46. return null; // Or handle null/empty values as needed
  47. }
  48. if (type == String.class) {
  49. return value;
  50. } else if (type == Integer.class) {
  51. try {
  52. return Integer.parseInt(value);
  53. } catch (NumberFormatException e) {
  54. throw new IllegalArgumentException("Invalid integer value: " + value, e);
  55. }
  56. } else if (type == Double.class) {
  57. try {
  58. return Double.parseDouble(value);
  59. } catch (NumberFormatException e) {
  60. throw new IllegalArgumentException("Invalid double value: " + value, e);
  61. }
  62. } else if (type == Boolean.class) {
  63. return Boolean.parseBoolean(value.toLowerCase());
  64. } else if (type == Long.class) {
  65. try {
  66. return Long.parseLong(value);
  67. } catch (NumberFormatException e) {
  68. throw new IllegalArgumentException("Invalid long value: " + value, e);
  69. }
  70. }
  71. else {
  72. return value; //Return as String if type not supported
  73. }
  74. }
  75. public static void main(String[] args) {
  76. // Example Usage
  77. Map<String, String> payload = new HashMap<>();
  78. payload.put("name", "John Doe");
  79. payload.put("age", "30");
  80. payload.put("height", "1.75");
  81. payload.put("isActive", "true");
  82. Map<String, Class<?>> expectedKeys = new HashMap<>();
  83. expectedKeys.put("name", String.class);
  84. expectedKeys.put("age", Integer.class);
  85. expectedKeys.put("height", Double.class);
  86. expectedKeys.put("isActive", Boolean.class);
  87. Map<String, Object> parsedPayload = parsePayload(payload, expectedKeys);
  88. if (parsedPayload != null) {
  89. System.out.println("Parsed Payload: " + parsedPayload);
  90. }
  91. //Example with missing key
  92. Map<String, String> payload2 = new HashMap<>();
  93. payload2.put("name", "Jane Doe");
  94. Map<String, Class<?>> expectedKeys2 = new HashMap<>();
  95. expectedKeys2.put("name", String.class);

Add your comment