# RFC: is_json function

- Status: Obsolete
- Authors: Juan Carlos Morales, dev.juan.morales@gmail.com
- Date: 2022-08-14
- Version: 0.9
- Implementation: https://github.com/php/php-src/pull/9355
- Original: https://wiki.php.net/rfc/is_json
- Page: https://externals.io/rfc/is_json
- More for agents: search with https://externals.io/search.md?q={query} · RFCs at https://externals.io/rfc.md · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

## Discussions on the mailing list

No thread found.

---

## Preliminary note

**If the name of the function needs to be change, I will change it; the functionality is the important thing here**

## Introduction

This RFC introduces a new function called is\_json() to validate if an string contains a valid json.

Most userland implementations to achieve this are done using json\_decode() which by design generates an object/array while parsing the string, ergo using memory and processing, that could be save.

## Proposal

### Description

```php
is_json(string $json, int $depth = 512, int $flags = 0): bool
```

### Parameters

**`json`**

The json string being analyzed.

This function only works with UTF-8 encoded strings.

Note:

PHP implements a superset of JSON as specified in the original » RFC 7159.

**`depth`**

Maximum nesting depth of the structure being decoded.

**`flags`**

Bitmask of **JSON\_INVALID\_UTF8\_IGNORE**, **JSON\_THROW\_ON\_ERROR**. The behavior of these constants is described on the [JSON constants page](https://www.php.net/manual/en/json.constants.php).

Function description, examples, technical strategy, current JSON parser, etc.

### Return values

Returns **true** if the string passed contains a valid json, otherwise returns **false**.

### Extra behavior

\-

### Examples

\-

## Fundaments/Reasons

### Disadvantages of using json\_decode

By design, json\_decode() generates an object/array while parsing the string, ergo using memory and processing for it, that is not needed if the only thing to discover is if a string contains a valid json.

### Disadvantages of using regex

Using a regex for this task forces different, error-prone, hard to maintain, implementations.

### Needs from major projects and developers

In the “References” section, there is a list of major open-source php projects needing this feature; also in th mntioned section can find a link to one of the most popular StackOverflow questions, which somehow reflects the need from our developers to have a feature like this included.

### Complexity added in the core

At the moment, there is a JSON parser in the core, used by json\_decode to do its job, so there is no need to write a new JSON parser for this RFC; the proposed function will use the existing JSON parser exclusively to parse an string without generating any object/array in memory for it.

## Backward Incompatible Changes

None, as this is a new function only.

**is\_json** will no longer be available as a function name, could break potential userland implementations.

## Proposed PHP Version(s)

next PHP 8.x

## RFC Impact

This RFC has no impact on SAPIs, existing extensions, Opcache, etc.

## Open Issues

\- No open issues

## Future Scope

\- (To be defined)

## Proposed Voting Choices

\- (To be defined)

## Implementation

\- (To be done later after pushing to github)

## References

### Major Open-Source projects that will benefit out of this

[Symfony Framework](https://github.com/symfony/symfony/blob/870eeb975feb1abb4b8a1722e1fd57beeab2b230/src/Symfony/Component/Validator/Constraints/JsonValidator.php)

```php
class JsonValidator extends ConstraintValidator
```

[Laravel Framework](https://github.com/laravel/framework/blob/302a579f00ebcb2573f481054cbeadad9c970605/src/Illuminate/Validation/Concerns/ValidatesAttributes.php)

```php
    public function validateJson($attribute, $value)
    {
        if (is_array($value)) {
            return false;
        }
 
        if (! is_scalar($value) && ! is_null($value) && ! method_exists($value, '__toString')) {
            return false;
        }
 
        json_decode($value);
 
        return json_last_error() === JSON_ERROR_NONE;
    }
```

[Laravel Framework](https://github.com/laravel/framework/blob/61eac9cae4717699ecb3941b16c3d775820d4ca2/src/Illuminate/Support/Str.php)

```php
    public static function isJson($value)
    {
```

[Magento](https://github.com/magento/magento2/blob/7c6b6365a3c099509d6f6e6c306cb1821910aab0/app/code/Magento/User/Block/Role/Grid/User.php)

```php
    private function getJSONString($input)
    {
        $output = json_decode($input);
        return $output ? $this->_jsonEncoder->encode($output) : '{}';
    }
```

[Magento](https://github.com/magento/magento2/blob/7c6b6365a3c099509d6f6e6c306cb1821910aab0/lib/internal/Magento/Framework/DB/DataConverter/SerializedToJson.php)

```php
    protected function isValidJsonValue($value)
    {
        if (in_array($value, ['null', 'false', '0', '""', '[]'])
            || (json_decode($value) !== null && json_last_error() === JSON_ERROR_NONE)
        ) {
            return true;
        }
        //JSON last error reset
        json_encode([]);
        return false;
    }
```

[Magento](https://github.com/magento/magento2/blob/7c6b6365a3c099509d6f6e6c306cb1821910aab0/lib/internal/Magento/Framework/Serialize/JsonValidator.php)

```php
    public function isValid($string)
    {
        if ($string !== false && $string !== null && $string !== '') {
            json_decode($string);
            if (json_last_error() === JSON_ERROR_NONE) {
                return true;
            }
        }
        return false;
    }
```

[getgrav](https://github.com/getgrav/grav/blob/3e7f67f589267e61f823d19824f3ee1b9a8a38ff/system/src/Grav/Common/Data/Validation.php)

```php
    public static function validateJson($value, $params)
    {
        return (bool) (@json_decode($value));
    }
```

[Symfony htp-kernel ](https://github.com/symfony/http-kernel/blob/94986633e4c3e7facb7defbd094a2e1170486ab5/DataCollector/RequestDataCollector.php)

```php
    public function getPrettyJson()
    {
        $decoded = json_decode($this->getContent()); //<------ here 
 
        return \JSON_ERROR_NONE === json_last_error() ? json_encode($decoded, \JSON_PRETTY_PRINT) : null;
    }
```

[Respect / Validation](https://github.com/Respect/Validation/blob/3dcd859d986f1b586b5539ea19962723ab7352ed/library/Rules/Json.php)

```php
final class Json extends AbstractRule
{
    /**
     * {@inheritDoc}
     */
    public function validate($input): bool
    {
        if (!is_string($input) || $input === '') {
            return false;
        }
 
        json_decode($input);
 
        return json_last_error() === JSON_ERROR_NONE;
    }
}
```

[Respect / Validation](https://github.com/Respect/Validation/blob/3dcd859d986f1b586b5539ea19962723ab7352ed/library/Rules/Json.php)

```php
final class Json extends AbstractRule
{
    /**
     * {@inheritDoc}
     */
    public function validate($input): bool
    {
        if (!is_string($input) || $input === '') {
            return false;
        }
 
        json_decode($input);
 
        return json_last_error() === JSON_ERROR_NONE;
    }
}
```

[humhub](https://github.com/humhub/humhub/blob/26d7e2667a9317057abe335a056ac8e8f4d675fb/protected/humhub/modules/web/security/controllers/ReportController.php)

```php
    public function actionIndex()
    {
        Yii::$app->response->statusCode = 204;
 
        if(!SecuritySettings::isReportingEnabled()) {
            return;
        }
 
        $json_data = file_get_contents('php://input');
        if ($json_data = json_decode($json_data)) { //<----- json_decode() just to check if is valid json-string only
            $json_data = json_encode($json_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
            $json_data = preg_replace('/\'nonce-[^\']*\'/', "'nonce-xxxxxxxxxxxxxxxxxxxxxxxx'", $json_data);
            Yii::error($json_data, 'web.security');
        }
    }
```

[Prestashop](https://github.com/PrestaShop/PrestaShop/blob/24f9e510ecb0cb002ac3f4834f3210e8d9359899/classes/Validate.php)

```php
    public static function isJson($string)
    {
        json_decode($string);
 
        return json_last_error() == JSON_ERROR_NONE;
    }
```

[Wordpress CLI](https://github.com/wp-cli/wp-cli/blob/f3e4b0785aa3d3132ee73be30aedca8838a8fa06/php/utils.php)

```php
function is_json( $argument, $ignore_scalars = true ) {
    if ( ! is_string( $argument ) || '' === $argument ) {
        return false;
    }
 
    if ( $ignore_scalars && ! in_array( $argument[0], [ '{', '[' ], true ) ) {
        return false;
    }
 
    json_decode( $argument, $assoc = true );
 
    return json_last_error() === JSON_ERROR_NONE;
}
```

[JOOMLA CMS](https://github.com/joomla/joomla-cms/blob/09d14c65f25f9bc76f2698e69c4d7b35f43bc848/libraries/src/Form/Field/AccessiblemediaField.php)

```php
if (\is_string($value)) {
    json_decode($value); //<------ HERE
 
    // Check if value is a valid JSON string.
    if ($value !== '' && json_last_error() !== JSON_ERROR_NONE) {
        /**
         * If the value is not empty and is not a valid JSON string,
         * it is most likely a custom field created in Joomla 3 and
         * the value is a string that contains the file name.
        */
        if (is_file(JPATH_ROOT . '/' . $value)) {
            $value = '{"imagefile":"' . $value . '","alt_text":""}';
        } else {
            $value = '';
        }
    }
```

### Stackoverflow questions related to this

In PHP, this question is one of the most high ranked questions related to json &amp;&amp; php in stackoverflow, “Fastest way to check if a string is JSON in PHP?”. [The question](https://stackoverflow.com/questions/6041741/fastest-way-to-check-if-a-string-is-json-in-php)

Viewed 484k times. [The ranking](https://stackoverflow.com/questions/tagged/php%20json?sort=MostVotes&edited=true)

Person asking how to do exactly this, also providing a real use case; eventhough in python, the programming language is not important. [In Python](https://stackoverflow.com/questions/5508509/how-do-i-check-if-a-string-is-valid-json-in-python)

Someone has also doing exactly this , in JAVA. [In Java](https://stackoverflow.com/questions/3679479/check-if-file-is-json-java)

## Rejected Features

\- No rejected features currently.
