diff --git a/src/Parameters.php b/src/Parameters.php index d3cc999..5cae1c1 100644 --- a/src/Parameters.php +++ b/src/Parameters.php @@ -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)]; } /** diff --git a/tests/unit/ParametersTest.php b/tests/unit/ParametersTest.php index 03e7134..97685da 100644 --- a/tests/unit/ParametersTest.php +++ b/tests/unit/ParametersTest.php @@ -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 {