Skip to content

Commit cd7a3e5

Browse files
committed
[JsonStreamer] Add include_null_properties option
1 parent 36d8d5d commit cd7a3e5

23 files changed

+296
-147
lines changed

src/Symfony/Component/JsonStreamer/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ CHANGELOG
55
---
66

77
* Remove `nikic/php-parser` dependency
8+
* Add `include_null_properties` option to encode the properties with `null` value
89

910
7.3
1011
---

src/Symfony/Component/JsonStreamer/JsonStreamWriter.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929
/**
3030
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
3131
*
32-
* @implements StreamWriterInterface<array<string, mixed>>
32+
* @implements StreamWriterInterface<array{
33+
* include_null_properties?: bool,
34+
* ...<string, mixed>,
35+
* }>
3336
*
3437
* @experimental
3538
*/
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Symfony\Component\JsonStreamer\Tests\Fixtures\Model;
4+
5+
use Symfony\Component\JsonStreamer\Attribute\StreamedName;
6+
7+
class DummyWithDollarNamedProperties
8+
{
9+
#[StreamedName('$foo')]
10+
public bool $foo = true;
11+
12+
#[StreamedName('{$foo->bar}')]
13+
public bool $bar = true;
14+
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/double_nested_list.php

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,41 @@
55
*/
66
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
77
try {
8-
yield '[';
9-
$prefix = '';
8+
yield "[";
9+
$prefix1 = '';
1010
foreach ($data as $value1) {
11-
yield $prefix;
12-
yield '{"dummies":[';
13-
$prefix = '';
11+
$prefix2 = '';
12+
yield "{$prefix1}{{$prefix2}\"dummies\":";
13+
yield "[";
14+
$prefix3 = '';
1415
foreach ($value1->dummies as $value2) {
15-
yield $prefix;
16-
yield '{"dummies":[';
17-
$prefix = '';
16+
$prefix4 = '';
17+
yield "{$prefix3}{{$prefix4}\"dummies\":";
18+
yield "[";
19+
$prefix5 = '';
1820
foreach ($value2->dummies as $value3) {
19-
yield $prefix;
20-
yield '{"id":';
21+
$prefix6 = '';
22+
yield "{$prefix5}{{$prefix6}\"id\":";
2123
yield \json_encode($value3->id, \JSON_THROW_ON_ERROR, 506);
22-
yield ',"name":';
24+
$prefix6 = ',';
25+
yield "{$prefix6}\"name\":";
2326
yield \json_encode($value3->name, \JSON_THROW_ON_ERROR, 506);
24-
yield '}';
25-
$prefix = ',';
27+
yield "}";
28+
$prefix5 = ',';
2629
}
27-
yield '],"customProperty":';
30+
$prefix4 = ',';
31+
yield "]{$prefix4}\"customProperty\":";
2832
yield \json_encode($value2->customProperty, \JSON_THROW_ON_ERROR, 508);
29-
yield '}';
30-
$prefix = ',';
33+
yield "}";
34+
$prefix3 = ',';
3135
}
32-
yield '],"stringProperty":';
36+
$prefix2 = ',';
37+
yield "]{$prefix2}\"stringProperty\":";
3338
yield \json_encode($value1->stringProperty, \JSON_THROW_ON_ERROR, 510);
34-
yield '}';
35-
$prefix = ',';
39+
yield "}";
40+
$prefix1 = ',';
3641
}
37-
yield ']';
42+
yield "]";
3843
} catch (\JsonException $e) {
3944
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
4045
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/nested_list.php

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,30 @@
55
*/
66
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
77
try {
8-
yield '[';
9-
$prefix = '';
8+
yield "[";
9+
$prefix1 = '';
1010
foreach ($data as $value1) {
11-
yield $prefix;
12-
yield '{"dummies":[';
13-
$prefix = '';
11+
$prefix2 = '';
12+
yield "{$prefix1}{{$prefix2}\"dummies\":";
13+
yield "[";
14+
$prefix3 = '';
1415
foreach ($value1->dummies as $value2) {
15-
yield $prefix;
16-
yield '{"id":';
16+
$prefix4 = '';
17+
yield "{$prefix3}{{$prefix4}\"id\":";
1718
yield \json_encode($value2->id, \JSON_THROW_ON_ERROR, 508);
18-
yield ',"name":';
19+
$prefix4 = ',';
20+
yield "{$prefix4}\"name\":";
1921
yield \json_encode($value2->name, \JSON_THROW_ON_ERROR, 508);
20-
yield '}';
21-
$prefix = ',';
22+
yield "}";
23+
$prefix3 = ',';
2224
}
23-
yield '],"customProperty":';
25+
$prefix2 = ',';
26+
yield "]{$prefix2}\"customProperty\":";
2427
yield \json_encode($value1->customProperty, \JSON_THROW_ON_ERROR, 510);
25-
yield '}';
26-
$prefix = ',';
28+
yield "}";
29+
$prefix1 = ',';
2730
}
28-
yield ']';
31+
yield "]";
2932
} catch (\JsonException $e) {
3033
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
3134
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/null.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
77
try {
8-
yield 'null';
8+
yield "null";
99
} catch (\JsonException $e) {
1010
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
1111
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/nullable_backed_enum.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
if ($data instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyBackedEnum) {
99
yield \json_encode($data->value, \JSON_THROW_ON_ERROR, 512);
1010
} elseif (null === $data) {
11-
yield 'null';
11+
yield "null";
1212
} else {
1313
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
1414
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/nullable_object.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
77
try {
88
if ($data instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes) {
9-
yield '{"@id":';
9+
$prefix1 = '';
10+
yield "{{$prefix1}\"@id\":";
1011
yield \json_encode($data->id, \JSON_THROW_ON_ERROR, 511);
11-
yield ',"name":';
12+
$prefix1 = ',';
13+
yield "{$prefix1}\"name\":";
1214
yield \json_encode($data->name, \JSON_THROW_ON_ERROR, 511);
13-
yield '}';
15+
yield "}";
1416
} elseif (null === $data) {
15-
yield 'null';
17+
yield "null";
1618
} else {
1719
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
1820
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/nullable_object_dict.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
77
try {
88
if (\is_array($data)) {
9-
yield '{';
10-
$prefix = '';
9+
yield "{";
10+
$prefix1 = '';
1111
foreach ($data as $key1 => $value1) {
1212
$key1 = \substr(\json_encode($key1), 1, -1);
13-
yield "{$prefix}\"{$key1}\":";
14-
yield '{"@id":';
13+
$prefix2 = '';
14+
yield "{$prefix1}\"{$key1}\":{{$prefix2}\"@id\":";
1515
yield \json_encode($value1->id, \JSON_THROW_ON_ERROR, 510);
16-
yield ',"name":';
16+
$prefix2 = ',';
17+
yield "{$prefix2}\"name\":";
1718
yield \json_encode($value1->name, \JSON_THROW_ON_ERROR, 510);
18-
yield '}';
19-
$prefix = ',';
19+
yield "}";
20+
$prefix1 = ',';
2021
}
21-
yield '}';
22+
yield "}";
2223
} elseif (null === $data) {
23-
yield 'null';
24+
yield "null";
2425
} else {
2526
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
2627
}

src/Symfony/Component/JsonStreamer/Tests/Fixtures/stream_writer/nullable_object_list.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
77
try {
88
if (\is_array($data)) {
9-
yield '[';
10-
$prefix = '';
9+
yield "[";
10+
$prefix1 = '';
1111
foreach ($data as $value1) {
12-
yield $prefix;
13-
yield '{"@id":';
12+
$prefix2 = '';
13+
yield "{$prefix1}{{$prefix2}\"@id\":";
1414
yield \json_encode($value1->id, \JSON_THROW_ON_ERROR, 510);
15-
yield ',"name":';
15+
$prefix2 = ',';
16+
yield "{$prefix2}\"name\":";
1617
yield \json_encode($value1->name, \JSON_THROW_ON_ERROR, 510);
17-
yield '}';
18-
$prefix = ',';
18+
yield "}";
19+
$prefix1 = ',';
1920
}
20-
yield ']';
21+
yield "]";
2122
} elseif (null === $data) {
22-
yield 'null';
23+
yield "null";
2324
} else {
2425
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
2526
}

0 commit comments

Comments
 (0)