<?php
/**
* Validates JSON payloads for staging environments with defensive checks.
*
* @param string $jsonString The JSON string to validate.
* @param array $requiredFields An array of required field names.
* @return array|false An associative array of validation errors, or false on fatal error.
*/
function validateJsonPayload(string $jsonString, array $requiredFields): array|false
{
$errors = [];
// Decode the JSON string
$data = json_decode($jsonString, true);
// Check for JSON decoding errors
if (json_last_error() !== JSON_ERROR_NONE) {
$errors['json_error'] = json_last_error_msg();
return $errors;
}
// Defensive check: Ensure decoded data is an array
if (!is_array($data)) {
$errors['type_error'] = 'Expected JSON object (array).';
return $errors;
}
// Validate required fields
foreach ($requiredFields as $field) {
if (!isset($data[$field])) {
$errors[$field] = "Field '$field' is required.";
}
}
// Defensive check: Ensure data types are valid (example: string, integer, boolean)
foreach ($requiredFields as $field) {
if (isset($data[$field])) {
$expectedType = 'string'; // Default type. Can be configured.
if (array_key_exists($field, $_ENV) && $_ENV[$field] === 'integer') {
$expectedType = 'integer';
}
if (array_key_exists($field, $_ENV) && $_ENV[$field] === 'boolean') {
$expectedType = 'boolean';
}
if (!is_string($data[$field]) && $expectedType === 'string') {
$errors[$field] = "Field '$field' must be a string.";
} elseif (!is_int($data[$field]) && $expectedType === 'integer') {
$errors[$field] = "Field '$field' must be an integer.";
} elseif (!is_bool($data[$field]) && $expectedType === 'boolean') {
$errors[$field] = "Field '$field' must be a boolean.";
}
}
}
return $errors;
}
//Example Usage (for testing):
/*
$json = '{
"name": "John Doe",
"age": 30,
"city": "New York"
}';
$required = ['name', 'age'];
$validationErrors = validateJsonPayload($json, $required);
if (empty($validationErrors)) {
echo "JSON payload is valid.\n";
} else {
echo "JSON payload is invalid:\n";
foreach ($validationErrors as $error) {
echo $error . "\n";
}
}
*/
?>
Add your comment