Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PHP 8.3] Added json_validate function description. #2906

Merged
merged 4 commits into from
Nov 14, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 160 additions & 0 deletions reference/json/functions/json-validate.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="function.json-validate" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>json_validate</refname>
<refpurpose>Checks if a string contains valid JSON</refpurpose>
</refnamediv>

<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>bool</type><methodname>json_validate</methodname>
<methodparam><type>string</type><parameter>json</parameter></methodparam>
<methodparam><type>int</type><parameter>depth</parameter><initializer>512</initializer></methodparam>
<methodparam><type>int</type><parameter>flags</parameter><initializer>0</initializer></methodparam>
</methodsynopsis>
<para>
Returns whether the given &string; is syntactically valid JSON.
If <function>json_validate</function> returns &true;, <function>json_decode</function>
will successfully decode the given string when using the same
<parameter>depth</parameter> and <parameter>flags</parameter>.
</para>
<para>
If <function>json_validate</function> returns &false;, the cause
can be retrieved using <function>json_last_error</function> and
<function>json_last_error_msg</function>.
</para>
<para>
<function>json_validate</function> uses less memory than
<function>json_decode</function> if the decoded JSON payload is
not used, because it does not need to build the array or
object structure containing the payload.
</para>
<caution>
<para>
Calling <function>json_validate</function> immediately before
<function>json_decode</function> will unnecessarily parse the string
twice, as <function>json_decode</function> implicitly performs
validation during decoding.
</para>
<para>
<function>json_validate</function> should therefore only be used
if the decode JSON payload is not immediately used and knowing whether
the string contains valid JSON is needed.
</para>
</caution>
</refsect1>

<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>json</parameter></term>
<listitem>
<para>
The string to validate.
</para>
<para>
This function only works with UTF-8 encoded strings.
</para>
&json.implementation.superset;
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>depth</parameter></term>
<listitem>
<para>
Maximum nesting depth of the structure being decoded.
The value must be greater than <literal>0</literal>,
and less than or equal to <literal>2147483647</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>flags</parameter></term>
<listitem>
<para>
Bitmask of
<constant>JSON_INVALID_UTF8_IGNORE</constant>.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is confusing?

Should be a bitmask of JSON_* constatns no?

Copy link
Member Author

@mumumu mumumu Nov 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems that json_validate accepts PHP_JSON_INVALID_UTF8_IGNORE only.

	if ((options != 0) && (options != PHP_JSON_INVALID_UTF8_IGNORE)) {
		zend_argument_value_error(3, "must be a valid flag (allowed flags: JSON_INVALID_UTF8_IGNORE)");
		RETURN_THROWS();
	}

https://github.com/php/php-src/blob/ea299d44a155e0ef39c24a4d79b0e51accf8d9d0/ext/json/json.c#L329-L332

We should change as the following?

    <varlistentry>
     <term><parameter>flags</parameter></term>
     <listitem>
      <para>
       Currently only 
       <constant>JSON_INVALID_UTF8_IGNORE</constant>
       is accepted.
      </para>
     </listitem>
    </varlistentry>

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I think this makes more sense. :)

The behaviour of these constants is described on the
<link linkend="json.constants">JSON constants</link> page.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>

<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Returns &true; if the given string is syntactically valid JSON, otherwise
returns &false;.
</para>
</refsect1>

<refsect1 role="errors">
&reftitle.errors;
<para>
If <parameter>depth</parameter> is outside the allowed range,
a <classname>ValueError</classname> is thrown.
</para>
</refsect1>

<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>json_validate</function> examples</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump(json_validate('{ "test": { "foo": "bar" } }'));
var_dump(json_validate('{ "": "": "" } }'));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(true)
bool(false)
]]>
</screen>
</example>
</para>
</refsect1>

<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>json_decode</function></member>
<member><function>json_last_error</function></member>
<member><function>json_last_error_msg</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
1 change: 1 addition & 0 deletions reference/json/versions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<versions>
<function name='json_decode' from='PHP 5 &gt;= 5.2.0, PHP 7, PHP 8, PECL json &gt;= 1.2.0'/>
<function name='json_encode' from='PHP 5 &gt;= 5.2.0, PHP 7, PHP 8, PECL json &gt;= 1.2.0'/>
<function name='json_validate' from='PHP 8 &gt;= 8.3.0'/>
<function name='json_last_error' from='PHP 5 &gt;= 5.3.0, PHP 7, PHP 8'/>
<function name='json_last_error_msg' from='PHP 5 &gt;= 5.5.0, PHP 7, PHP 8'/>

Expand Down