diff --git a/README.md b/README.md index ef2b56a..443561f 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ A PHP library with a variety of string manipulation functions with multibyte sup * [isAlphanumeric](#isalphanumeric) * [isBlank](#isblank) * [isHexadecimal](#ishexadecimal) + * [isJson](#isjson) * [isLowerCase](#islowercase) * [isSerialized](#isserialized) * [isUpperCase](#isuppercase) @@ -352,6 +353,19 @@ S::create('A102F')->isHexadecimal(); S::isHexadecimal('A102F'); // true ``` +#### isJson + +$stringy->isJson() + +S::isJson(string $str [, string $encoding ]) + +Returns true if the string is JSON, false otherwise. + +```php +S::create('{"foo":"bar"}')->isJson(); +S::isJson('{"foo":"bar"}'); // true +``` + #### isLowerCase $stringy->isLowerCase() diff --git a/src/Stringy/StaticStringy.php b/src/Stringy/StaticStringy.php index fd3a49f..013aafd 100644 --- a/src/Stringy/StaticStringy.php +++ b/src/Stringy/StaticStringy.php @@ -624,6 +624,18 @@ class StaticStringy return Stringy::create($str, $encoding)->isBlank(); } + /** + * Returns true if the string is JSON, false otherwise. + * + * @param string $str String to check + * @param string $encoding The character encoding + * @return bool Whether or not $str is JSON + */ + public static function isJson($str, $encoding = null) + { + return Stringy::create($str, $encoding)->isJson(); + } + /** * Returns true if the string contains only lower case chars, false otherwise. * diff --git a/src/Stringy/Stringy.php b/src/Stringy/Stringy.php index 9c0b52b..cf5f03d 100644 --- a/src/Stringy/Stringy.php +++ b/src/Stringy/Stringy.php @@ -1002,6 +1002,21 @@ class Stringy return $this->matchesPattern('^([[:space:]])*$'); } + /** + * Returns true if the string is JSON, false otherwise. + * + * @return bool Whether or not $str is JSON + */ + public function isJson() + { + if (!$this->endsWith('}') && !$this->endsWith(']')) { + return false; + } + + return !is_null(json_decode($this->str)); + } + + /** * Returns true if the string contains only lower case chars, false otherwise. * diff --git a/tests/Stringy/CommonTest.php b/tests/Stringy/CommonTest.php index ccd43f1..9778c70 100644 --- a/tests/Stringy/CommonTest.php +++ b/tests/Stringy/CommonTest.php @@ -766,6 +766,28 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase return $testData; } + public function stringsForIsJson() + { + $testData = array( + array(false, ''), + array(false, '123'), + array(true, '{"foo": "bar"}'), + array(false, '{"foo":"bar",}'), + array(false, '{"foo"}'), + array(true, '["foo"]'), + array(false, '{"foo": "bar"]'), + array(false, '123', 'UTF-8'), + array(true, '{"fòô": "bàř"}', 'UTF-8'), + array(false, '{"fòô":"bàř",}', 'UTF-8'), + array(false, '{"fòô"}', 'UTF-8'), + array(false, '["fòô": "bàř"]', 'UTF-8'), + array(true, '["fòô"]', 'UTF-8'), + array(false, '{"fòô": "bàř"]', 'UTF-8'), + ); + + return $testData; + } + public function stringsForIsLowerCase() { $testData = array( diff --git a/tests/Stringy/StaticStringyTest.php b/tests/Stringy/StaticStringyTest.php index 1287102..ca17595 100644 --- a/tests/Stringy/StaticStringyTest.php +++ b/tests/Stringy/StaticStringyTest.php @@ -471,6 +471,16 @@ class StaticStringyTestCase extends CommonTest $this->assertInternalType('boolean', $result); $this->assertEquals($expected, $result); } + + /** + * @dataProvider stringsForIsJson + */ + public function testIsJson($expected, $str, $encoding = null) + { + $result = S::isJson($str, $encoding); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + } /** * @dataProvider stringsForIsLowerCase diff --git a/tests/Stringy/StringyTest.php b/tests/Stringy/StringyTest.php index a4353a6..0397dfc 100644 --- a/tests/Stringy/StringyTest.php +++ b/tests/Stringy/StringyTest.php @@ -556,6 +556,18 @@ class StringyTestCase extends CommonTest $this->assertEquals($str, $stringy); } + /** + * @dataProvider stringsForIsJson + */ + public function testIsJson($expected, $str, $encoding = null) + { + $stringy = S::create($str, $encoding); + $result = $stringy->isJson(); + $this->assertInternalType('boolean', $result); + $this->assertEquals($expected, $result); + $this->assertEquals($str, $stringy); + } + /** * @dataProvider stringsForIsLowerCase */