Skip to content

Commit 7fbb937

Browse files
committed
Merge branch 'master' into 3.1
# Conflicts: # src/redis/composer.json # src/validation/tests/Cases/ValidateAttributesTest.php
2 parents 62e12d5 + 9f24287 commit 7fbb937

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

src/Concerns/ValidatesAttributes.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
use Hyperf\Validation\ValidationData;
3030
use InvalidArgumentException;
3131
use SplFileInfo;
32+
use Stringable;
3233
use Throwable;
3334

3435
use function Hyperf\Collection\last;
@@ -888,13 +889,17 @@ public function validateMacAddress(string $attribute, mixed $value): bool
888889
*/
889890
public function validateJson(string $attribute, $value): bool
890891
{
891-
if (! is_scalar($value) && ! method_exists($value, '__toString')) {
892-
return false;
892+
if ($value instanceof Stringable) {
893+
$value = (string) $value;
893894
}
894895

895-
json_decode($value);
896+
try {
897+
json_decode($value, flags: JSON_THROW_ON_ERROR);
898+
} catch (Throwable) {
899+
return false;
900+
}
896901

897-
return json_last_error() === JSON_ERROR_NONE;
902+
return true;
898903
}
899904

900905
/**

tests/Cases/ValidateAttributesTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use HyperfTest\Validation\Cases\Stub\ValidatesAttributesStub;
1515
use PHPUnit\Framework\Attributes\CoversNothing;
1616
use PHPUnit\Framework\TestCase;
17+
use Stringable;
1718

1819
/**
1920
* @internal
@@ -93,4 +94,41 @@ public function testValidateAscii()
9394
$this->assertFalse($validator->validateAscii('', 'ユニコードを基盤技術と-_123'));
9495
$this->assertFalse($validator->validateAscii('', 'नमस्कार-_'));
9596
}
97+
98+
public function testValidateJson()
99+
{
100+
$validator = new ValidatesAttributesStub();
101+
// null
102+
$this->assertFalse($validator->validateJson('', null));
103+
$this->assertTrue($validator->validateJson('', 'null'));
104+
// int
105+
$this->assertTrue($validator->validateJson('', '3'));
106+
$this->assertFalse($validator->validateJson('', 3));
107+
// float
108+
$this->assertTrue($validator->validateJson('', '3.14'));
109+
$this->assertFalse($validator->validateJson('', 3.14));
110+
// string
111+
$this->assertFalse($validator->validateJson('', 'plain_text'));
112+
$this->assertTrue($validator->validateJson('', '{"foo": "bar"}'));
113+
$this->assertFalse($validator->validateJson('', '{"foo": "bar",a}'));
114+
// array
115+
$this->assertTrue($validator->validateJson('', '[3.14]'));
116+
$this->assertFalse($validator->validateJson('', [3.14]));
117+
$this->assertTrue($validator->validateJson('', '["a"]'));
118+
// object
119+
$this->assertFalse($validator->validateJson('', new class() {}));
120+
$this->assertTrue($validator->validateJson('', new class() implements Stringable {
121+
public function __toString(): string
122+
{
123+
return json_encode(['foo' => 'bar'], JSON_UNESCAPED_UNICODE);
124+
}
125+
}));
126+
127+
$this->assertTrue($validator->validateJson('', new class() {
128+
public function __toString(): string
129+
{
130+
return json_encode(['foo' => 'bar'], JSON_UNESCAPED_UNICODE);
131+
}
132+
}));
133+
}
96134
}

0 commit comments

Comments
 (0)