Add pjson support for 1D arrays

This commit is contained in:
Daniel J. Summers 2024-07-04 12:05:29 -04:00
parent 478684621c
commit 5201e564ca
2 changed files with 24 additions and 4 deletions

View File

@ -27,10 +27,23 @@ class Parameters
*/
public static function json(string $name, object|array $document): array
{
return [$name => match (is_object($document) && method_exists($document, 'toJson')) {
true => $document->toJson(),
false => json_encode($document, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
}];
$flags = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;
if (is_object($document)) {
return [
$name => method_exists($document, 'toJson') ? $document->toJson($flags) : json_encode($document, $flags)
];
}
if (empty($document)) return [$name => json_encode($document, $flags)];
$key = array_key_first($document);
if (is_array($document[$key]) && method_exists($document[$key][array_key_first($document[$key])], 'toJson')) {
return [
$name => sprintf('{%s:[%s]}', json_encode($key, $flags),
implode(',', array_map(fn($it) => $it->toJson($flags), $document[$key])))
];
}
return [$name => json_encode($document, $flags)];
}
/**

View File

@ -50,6 +50,13 @@ class ParametersTest extends TestCase
'JSON parameter not constructed correctly');
}
public function testJsonSucceedsForArrayOfPjsonClass(): void
{
$this->assertEquals([':it' => '{"pjson":[{"id":"997","name":"another test","num_value":94}]}'],
Parameters::json(':it',
['pjson' => [new PjsonDocument(new PjsonId('997'), 'another test', 94, 'nothing')]]),
'JSON parameter not constructed correctly');
}
public function testNameFieldsSucceeds(): void
{