1. <?php
  2. /**
  3. * Validates JSON payloads for staging environments with defensive checks.
  4. *
  5. * @param string $jsonString The JSON string to validate.
  6. * @param array $requiredFields An array of required field names.
  7. * @return array|false An associative array of validation errors, or false on fatal error.
  8. */
  9. function validateJsonPayload(string $jsonString, array $requiredFields): array|false
  10. {
  11. $errors = [];
  12. // Decode the JSON string
  13. $data = json_decode($jsonString, true);
  14. // Check for JSON decoding errors
  15. if (json_last_error() !== JSON_ERROR_NONE) {
  16. $errors['json_error'] = json_last_error_msg();
  17. return $errors;
  18. }
  19. // Defensive check: Ensure decoded data is an array
  20. if (!is_array($data)) {
  21. $errors['type_error'] = 'Expected JSON object (array).';
  22. return $errors;
  23. }
  24. // Validate required fields
  25. foreach ($requiredFields as $field) {
  26. if (!isset($data[$field])) {
  27. $errors[$field] = "Field '$field' is required.";
  28. }
  29. }
  30. // Defensive check: Ensure data types are valid (example: string, integer, boolean)
  31. foreach ($requiredFields as $field) {
  32. if (isset($data[$field])) {
  33. $expectedType = 'string'; // Default type. Can be configured.
  34. if (array_key_exists($field, $_ENV) && $_ENV[$field] === 'integer') {
  35. $expectedType = 'integer';
  36. }
  37. if (array_key_exists($field, $_ENV) && $_ENV[$field] === 'boolean') {
  38. $expectedType = 'boolean';
  39. }
  40. if (!is_string($data[$field]) && $expectedType === 'string') {
  41. $errors[$field] = "Field '$field' must be a string.";
  42. } elseif (!is_int($data[$field]) && $expectedType === 'integer') {
  43. $errors[$field] = "Field '$field' must be an integer.";
  44. } elseif (!is_bool($data[$field]) && $expectedType === 'boolean') {
  45. $errors[$field] = "Field '$field' must be a boolean.";
  46. }
  47. }
  48. }
  49. return $errors;
  50. }
  51. //Example Usage (for testing):
  52. /*
  53. $json = '{
  54. "name": "John Doe",
  55. "age": 30,
  56. "city": "New York"
  57. }';
  58. $required = ['name', 'age'];
  59. $validationErrors = validateJsonPayload($json, $required);
  60. if (empty($validationErrors)) {
  61. echo "JSON payload is valid.\n";
  62. } else {
  63. echo "JSON payload is invalid:\n";
  64. foreach ($validationErrors as $error) {
  65. echo $error . "\n";
  66. }
  67. }
  68. */
  69. ?>

Add your comment