Skip to content

Commit 7982333

Browse files
committed
[JsonStreamer] Skip properties with null value
1 parent f4f3a32 commit 7982333

20 files changed

+215
-106
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+
* Skip properties with `null` value
89

910
7.3
1011
---
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/null.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield 'null';
5+
yield "null";
66
} catch (\JsonException $e) {
77
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
88
}

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
@@ -5,7 +5,7 @@
55
if ($data instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyBackedEnum) {
66
yield \json_encode($data->value, \JSON_THROW_ON_ERROR, 512);
77
} elseif (null === $data) {
8-
yield 'null';
8+
yield "null";
99
} else {
1010
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
1111
}

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
@@ -3,13 +3,15 @@
33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
55
if ($data instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes) {
6-
yield '{"@id":';
6+
$prefix1 = '';
7+
yield "{{$prefix1}\"@id\":";
78
yield \json_encode($data->id, \JSON_THROW_ON_ERROR, 511);
8-
yield ',"name":';
9+
$prefix1 = ',';
10+
yield "{$prefix1}\"name\":";
911
yield \json_encode($data->name, \JSON_THROW_ON_ERROR, 511);
10-
yield '}';
12+
yield "}";
1113
} elseif (null === $data) {
12-
yield 'null';
14+
yield "null";
1315
} else {
1416
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
1517
}

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
@@ -3,21 +3,22 @@
33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
55
if (\is_array($data)) {
6-
yield '{';
7-
$prefix = '';
6+
yield "{";
7+
$prefix1 = '';
88
foreach ($data as $key => $value) {
99
$key = \substr(\json_encode($key), 1, -1);
10-
yield "{$prefix}\"{$key}\":";
11-
yield '{"@id":';
10+
$prefix2 = '';
11+
yield "{$prefix1}\"{$key}\":{{$prefix2}\"@id\":";
1212
yield \json_encode($value->id, \JSON_THROW_ON_ERROR, 510);
13-
yield ',"name":';
13+
$prefix2 = ',';
14+
yield "{$prefix2}\"name\":";
1415
yield \json_encode($value->name, \JSON_THROW_ON_ERROR, 510);
15-
yield '}';
16-
$prefix = ',';
16+
yield "}";
17+
$prefix1 = ',';
1718
}
18-
yield '}';
19+
yield "}";
1920
} elseif (null === $data) {
20-
yield 'null';
21+
yield "null";
2122
} else {
2223
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
2324
}

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
@@ -3,20 +3,21 @@
33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
55
if (\is_array($data)) {
6-
yield '[';
7-
$prefix = '';
6+
yield "[";
7+
$prefix1 = '';
88
foreach ($data as $value) {
9-
yield $prefix;
10-
yield '{"@id":';
9+
$prefix2 = '';
10+
yield "{$prefix1}{{$prefix2}\"@id\":";
1111
yield \json_encode($value->id, \JSON_THROW_ON_ERROR, 510);
12-
yield ',"name":';
12+
$prefix2 = ',';
13+
yield "{$prefix2}\"name\":";
1314
yield \json_encode($value->name, \JSON_THROW_ON_ERROR, 510);
14-
yield '}';
15-
$prefix = ',';
15+
yield "}";
16+
$prefix1 = ',';
1617
}
17-
yield ']';
18+
yield "]";
1819
} elseif (null === $data) {
19-
yield 'null';
20+
yield "null";
2021
} else {
2122
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data)));
2223
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '{"@id":';
5+
$prefix1 = '';
6+
yield "{{$prefix1}\"@id\":";
67
yield \json_encode($data->id, \JSON_THROW_ON_ERROR, 511);
7-
yield ',"name":';
8+
$prefix1 = ',';
9+
yield "{$prefix1}\"name\":";
810
yield \json_encode($data->name, \JSON_THROW_ON_ERROR, 511);
9-
yield '}';
11+
yield "}";
1012
} catch (\JsonException $e) {
1113
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
1214
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '{';
6-
$prefix = '';
5+
yield "{";
6+
$prefix1 = '';
77
foreach ($data as $key => $value) {
88
$key = \substr(\json_encode($key), 1, -1);
9-
yield "{$prefix}\"{$key}\":";
10-
yield '{"@id":';
9+
$prefix2 = '';
10+
yield "{$prefix1}\"{$key}\":{{$prefix2}\"@id\":";
1111
yield \json_encode($value->id, \JSON_THROW_ON_ERROR, 510);
12-
yield ',"name":';
12+
$prefix2 = ',';
13+
yield "{$prefix2}\"name\":";
1314
yield \json_encode($value->name, \JSON_THROW_ON_ERROR, 510);
14-
yield '}';
15-
$prefix = ',';
15+
yield "}";
16+
$prefix1 = ',';
1617
}
17-
yield '}';
18+
yield "}";
1819
} catch (\JsonException $e) {
1920
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
2021
}

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,25 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '{"name":';
5+
$prefix1 = '';
6+
yield "{{$prefix1}\"name\":";
67
yield \json_encode($data->name, \JSON_THROW_ON_ERROR, 511);
7-
yield ',"otherDummyOne":{"@id":';
8+
$prefix1 = ',';
9+
yield "{$prefix1}\"otherDummyOne\":";
10+
$prefix2 = '';
11+
yield "{{$prefix2}\"@id\":";
812
yield \json_encode($data->otherDummyOne->id, \JSON_THROW_ON_ERROR, 510);
9-
yield ',"name":';
13+
$prefix2 = ',';
14+
yield "{$prefix2}\"name\":";
1015
yield \json_encode($data->otherDummyOne->name, \JSON_THROW_ON_ERROR, 510);
11-
yield '},"otherDummyTwo":{"id":';
16+
yield "}{$prefix1}\"otherDummyTwo\":";
17+
$prefix2 = '';
18+
yield "{{$prefix2}\"id\":";
1219
yield \json_encode($data->otherDummyTwo->id, \JSON_THROW_ON_ERROR, 510);
13-
yield ',"name":';
20+
$prefix2 = ',';
21+
yield "{$prefix2}\"name\":";
1422
yield \json_encode($data->otherDummyTwo->name, \JSON_THROW_ON_ERROR, 510);
15-
yield '}}';
23+
yield "}}";
1624
} catch (\JsonException $e) {
1725
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
1826
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '{';
6-
$prefix = '';
5+
yield "{";
6+
$prefix1 = '';
77
foreach ($data as $key => $value) {
88
$key = is_int($key) ? $key : \substr(\json_encode($key), 1, -1);
9-
yield "{$prefix}\"{$key}\":";
10-
yield '{"id":';
9+
$prefix2 = '';
10+
yield "{$prefix1}\"{$key}\":{{$prefix2}\"id\":";
1111
yield \json_encode($value->id, \JSON_THROW_ON_ERROR, 510);
12-
yield ',"name":';
12+
$prefix2 = ',';
13+
yield "{$prefix2}\"name\":";
1314
yield \json_encode($value->name, \JSON_THROW_ON_ERROR, 510);
14-
yield '}';
15-
$prefix = ',';
15+
yield "}";
16+
$prefix1 = ',';
1617
}
17-
yield '}';
18+
yield "}";
1819
} catch (\JsonException $e) {
1920
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
2021
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '[';
6-
$prefix = '';
5+
yield "[";
6+
$prefix1 = '';
77
foreach ($data as $value) {
8-
yield $prefix;
9-
yield '{"@id":';
8+
$prefix2 = '';
9+
yield "{$prefix1}{{$prefix2}\"@id\":";
1010
yield \json_encode($value->id, \JSON_THROW_ON_ERROR, 510);
11-
yield ',"name":';
11+
$prefix2 = ',';
12+
yield "{$prefix2}\"name\":";
1213
yield \json_encode($value->name, \JSON_THROW_ON_ERROR, 510);
13-
yield '}';
14-
$prefix = ',';
14+
yield "}";
15+
$prefix1 = ',';
1516
}
16-
yield ']';
17+
yield "]";
1718
} catch (\JsonException $e) {
1819
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
1920
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
4+
try {
5+
$prefix1 = '';
6+
yield "{{$prefix1}\"\$foo\":";
7+
yield $data->foo ? 'true' : 'false';
8+
$prefix1 = ',';
9+
yield "{$prefix1}\"{\$foo->bar}\":";
10+
yield $data->bar ? 'true' : 'false';
11+
yield "}";
12+
} catch (\JsonException $e) {
13+
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
14+
}
15+
};

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '{"value":';
6-
if ($data->value instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyBackedEnum) {
7-
yield \json_encode($data->value->value, \JSON_THROW_ON_ERROR, 511);
8-
} elseif (null === $data->value) {
9-
yield 'null';
10-
} elseif (\is_string($data->value)) {
11-
yield \json_encode($data->value, \JSON_THROW_ON_ERROR, 511);
12-
} else {
13-
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data->value)));
5+
$prefix1 = '';
6+
yield "{";
7+
if (null !== $data->value) {
8+
yield "{$prefix1}\"value\":";
9+
if ($data->value instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyBackedEnum) {
10+
yield \json_encode($data->value->value, \JSON_THROW_ON_ERROR, 511);
11+
} elseif (\is_string($data->value)) {
12+
yield \json_encode($data->value, \JSON_THROW_ON_ERROR, 511);
13+
} else {
14+
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data->value)));
15+
}
1416
}
15-
yield '}';
17+
yield "}";
1618
} catch (\JsonException $e) {
1719
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
1820
}

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
5-
yield '{"id":';
5+
$prefix1 = '';
6+
yield "{{$prefix1}\"id\":";
67
yield \json_encode($valueTransformers->get('Symfony\Component\JsonStreamer\Tests\Fixtures\ValueTransformer\DoubleIntAndCastToStringValueTransformer')->transform($data->id, $options), \JSON_THROW_ON_ERROR, 511);
7-
yield ',"active":';
8+
$prefix1 = ',';
9+
yield "{$prefix1}\"active\":";
810
yield \json_encode($valueTransformers->get('Symfony\Component\JsonStreamer\Tests\Fixtures\ValueTransformer\BooleanToStringValueTransformer')->transform($data->active, $options), \JSON_THROW_ON_ERROR, 511);
9-
yield ',"name":';
11+
yield "{$prefix1}\"name\":";
1012
yield \json_encode(strtolower($data->name), \JSON_THROW_ON_ERROR, 511);
11-
yield ',"range":';
13+
yield "{$prefix1}\"range\":";
1214
yield \json_encode(Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithValueTransformerAttributes::concatRange($data->range, $options), \JSON_THROW_ON_ERROR, 511);
13-
yield '}';
15+
yield "}";
1416
} catch (\JsonException $e) {
1517
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
1618
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
if ($depth >= 512) {
66
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException('Maximum stack depth exceeded');
77
}
8-
yield '{"@self":';
9-
if ($data->self instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Model\SelfReferencingDummy) {
8+
$prefix1 = '';
9+
yield "{";
10+
if (null !== $data->self) {
11+
yield "{$prefix1}\"@self\":";
1012
yield from $generators['Symfony\Component\JsonStreamer\Tests\Fixtures\Model\SelfReferencingDummy']($data->self, $depth + 1);
11-
} elseif (null === $data->self) {
12-
yield 'null';
13-
} else {
14-
throw new \Symfony\Component\JsonStreamer\Exception\UnexpectedValueException(\sprintf('Unexpected "%s" value.', \get_debug_type($data->self)));
1513
}
16-
yield '}';
14+
yield "}";
1715
};
1816
try {
1917
yield from $generators['Symfony\Component\JsonStreamer\Tests\Fixtures\Model\SelfReferencingDummy']($data, 0);

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,22 @@
33
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
44
try {
55
if (\is_array($data)) {
6-
yield '[';
7-
$prefix = '';
6+
yield "[";
7+
$prefix1 = '';
88
foreach ($data as $value) {
9-
yield $prefix;
9+
yield "{$prefix1}";
1010
yield \json_encode($value->value, \JSON_THROW_ON_ERROR, 511);
11-
$prefix = ',';
11+
$prefix1 = ',';
1212
}
13-
yield ']';
13+
yield "]";
1414
} elseif ($data instanceof \Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes) {
15-
yield '{"@id":';
15+
$prefix1 = '';
16+
yield "{{$prefix1}\"@id\":";
1617
yield \json_encode($data->id, \JSON_THROW_ON_ERROR, 511);
17-
yield ',"name":';
18+
$prefix1 = ',';
19+
yield "{$prefix1}\"name\":";
1820
yield \json_encode($data->name, \JSON_THROW_ON_ERROR, 511);
19-
yield '}';
21+
yield "}";
2022
} elseif (\is_int($data)) {
2123
yield \json_encode($data, \JSON_THROW_ON_ERROR, 512);
2224
} else {

0 commit comments

Comments
 (0)