0 关注者

类 yii\helpers\Json

继承yii\helpers\Json » yii\helpers\BaseJson
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/helpers/Json.php

Json 是一个提供 JSON 数据编码和解码的辅助类。

它通过支持编码 JavaScript 表达式和在解码失败时抛出异常来增强 PHP 内置函数 json_encode()json_decode()

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$jsonErrorMessages 数组 JSON 错误消息列表,分配给常量名称以更好地处理 PHP <= 5.5。 yii\helpers\BaseJson
$keepObjectType 布尔值 避免将具有零索引键的对象编码为数组 Json::encode((object)['test']) 将被编码为对象而不是数组。 yii\helpers\BaseJson
$prettyPrint 布尔值| 启用人类可读输出,也称为 yii\helpers\BaseJson

公共方法

隐藏继承的方法

方法 描述 定义于
decode() 将给定的 JSON 字符串解码为 PHP 数据结构。 yii\helpers\BaseJson
encode() 将给定的值编码为 JSON 字符串。 yii\helpers\BaseJson
errorSummary() 生成验证错误的摘要。 yii\helpers\BaseJson
htmlEncode() 将给定的值编码为 JSON 字符串,对实体进行 HTML 转义,使其可以安全地嵌入 HTML 代码中。 yii\helpers\BaseJson

受保护的方法

隐藏继承的方法

方法 描述 定义于
handleJsonError() 通过抛出带有相应错误消息的异常来处理 encode()decode() 错误。 yii\helpers\BaseJson
processData() 在将数据发送到 json_encode() 之前对其进行预处理。 yii\helpers\BaseJson

方法详细信息

隐藏继承的方法

decode() 公共静态方法

定义于: yii\helpers\BaseJson::decode()

将给定的 JSON 字符串解码为 PHP 数据结构。

public static 混合 decode ( $json, $asArray true )
$json 字符串

要解码的 JSON 字符串

$asArray 布尔值

是否以关联数组的形式返回对象。

返回 混合

PHP 数据

抛出 yii\base\InvalidArgumentException

如果有任何解码错误

                public static function decode($json, $asArray = true)
{
    if (is_array($json)) {
        throw new InvalidArgumentException('Invalid JSON data.');
    } elseif ($json === null || $json === '') {
        return null;
    }
    $decode = json_decode((string) $json, $asArray);
    static::handleJsonError(json_last_error());
    return $decode;
}

            
encode() 公共静态方法

定义于: yii\helpers\BaseJson::encode()

将给定的值编码为 JSON 字符串。

该方法通过支持 JavaScript 表达式来增强 json_encode()。特别是,该方法不会对以 yii\web\JsExpression 对象表示的 JavaScript 表达式进行编码。

请注意,根据 JSON 规范,编码为 JSON 的数据必须使用 UTF-8 编码。您必须确保传递给此方法的字符串在传递之前具有正确的编码。

public static 字符串 encode ( $value, $options 320 )
$value 混合

要编码的数据。

$options 整数

编码选项。有关更多详细信息,请参考 https://php.ac.cn/manual/en/function.json-encode.php。默认值为 JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE

返回 字符串

编码结果。

抛出 yii\base\InvalidArgumentException

如果有任何编码错误。

                public static function encode($value, $options = 320)
{
    $expressions = [];
    $value = static::processData($value, $expressions, uniqid('', true));
    set_error_handler(function () {
        static::handleJsonError(JSON_ERROR_SYNTAX);
    }, E_WARNING);
    if (static::$prettyPrint === true) {
        $options |= JSON_PRETTY_PRINT;
    } elseif (static::$prettyPrint === false) {
        $options &= ~JSON_PRETTY_PRINT;
    }
    $json = json_encode($value, $options);
    restore_error_handler();
    static::handleJsonError(json_last_error());
    return $expressions === [] ? $json : strtr($json, $expressions);
}

            
errorSummary() 公共静态方法 (可用版本 2.0.14)

定义于: yii\helpers\BaseJson::errorSummary()

生成验证错误的摘要。

public static 字符串 errorSummary ( $models, $options = [] )
$models yii\base\Model|yii\base\Model[]

要显示其验证错误的模型。

$options 数组

标签选项,以名称-值对的形式。以下选项会得到特殊处理

  • showAllErrors: 布尔值,如果设置为 true,则会显示每个属性的每个错误消息,否则只会显示每个属性的第一个错误消息。默认为 false
返回 字符串

生成的错误摘要

                public static function errorSummary($models, $options = [])
{
    $showAllErrors = ArrayHelper::remove($options, 'showAllErrors', false);
    $lines = self::collectErrors($models, $showAllErrors);
    return static::encode($lines);
}

            
handleJsonError() 受保护的静态方法 (可用版本 2.0.6)

定义于: yii\helpers\BaseJson::handleJsonError()

通过抛出带有相应错误消息的异常来处理 encode()decode() 错误。

protected static handleJsonError ( $lastError )
$lastError 整数

来自 json_last_error() 的错误代码。

抛出 yii\base\InvalidArgumentException

如果有任何编码/解码错误。

                protected static function handleJsonError($lastError)
{
    if ($lastError === JSON_ERROR_NONE) {
        return;
    }
    if (PHP_VERSION_ID >= 50500) {
        throw new InvalidArgumentException(json_last_error_msg(), $lastError);
    }
    foreach (static::$jsonErrorMessages as $const => $message) {
        if (defined($const) && constant($const) === $lastError) {
            throw new InvalidArgumentException($message, $lastError);
        }
    }
    throw new InvalidArgumentException('Unknown JSON encoding/decoding error.');
}

            
htmlEncode() 公共静态方法 (可用版本 2.0.4)

定义于: yii\helpers\BaseJson::htmlEncode()

将给定的值编码为 JSON 字符串,对实体进行 HTML 转义,使其可以安全地嵌入 HTML 代码中。

该方法通过支持 JavaScript 表达式来增强 json_encode()。特别是,该方法不会对以 yii\web\JsExpression 对象表示的 JavaScript 表达式进行编码。

请注意,根据 JSON 规范,编码为 JSON 的数据必须使用 UTF-8 编码。您必须确保传递给此方法的字符串在传递之前具有正确的编码。

public static string htmlEncode ( $value )
$value 混合

要编码的数据

返回 字符串

编码结果

抛出 yii\base\InvalidArgumentException

如果存在任何编码错误

                public static function htmlEncode($value)
{
    return static::encode($value, JSON_UNESCAPED_UNICODE | JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS);
}

            
processData() 受保护的静态方法

定义于: yii\helpers\BaseJson::processData()

在将数据发送到 json_encode() 之前对其进行预处理。

protected static mixed processData ( $data, &$expressions, $expPrefix )
$data 混合

要处理的数据

$expressions 数组

JavaScript 表达式集合

$expPrefix 字符串

内部用于处理 JS 表达式的前缀

返回 混合

处理后的数据

                protected static function processData($data, &$expressions, $expPrefix)
{
    $revertToObject = false;
    if (is_object($data)) {
        if ($data instanceof JsExpression) {
            $token = "!{[$expPrefix=" . count($expressions) . ']}!';
            $expressions['"' . $token . '"'] = $data->expression;
            return $token;
        }
        if ($data instanceof \JsonSerializable) {
            return static::processData($data->jsonSerialize(), $expressions, $expPrefix);
        }
        if ($data instanceof \DateTimeInterface) {
            return static::processData((array)$data, $expressions, $expPrefix);
        }
        if ($data instanceof Arrayable) {
            $data = $data->toArray();
        } elseif ($data instanceof \Generator) {
            $_data = [];
            foreach ($data as $name => $value) {
                $_data[$name] = static::processData($value, $expressions, $expPrefix);
            }
            $data = $_data;
        } elseif ($data instanceof \SimpleXMLElement) {
            $data = (array) $data;
            // Avoid empty elements to be returned as array.
            // Not breaking BC because empty array was always cast to stdClass before.
            $revertToObject = true;
        } else {
            /*
             * $data type is changed to array here and its elements will be processed further
             * We must cast $data back to object later to keep intended dictionary type in JSON.
             * Revert is only done when keepObjectType flag is provided to avoid breaking BC
             */
            $revertToObject = static::$keepObjectType;
            $result = [];
            foreach ($data as $name => $value) {
                $result[$name] = $value;
            }
            $data = $result;
            // Avoid empty objects to be returned as array (would break BC without keepObjectType flag)
            if ($data === []) {
                $revertToObject = true;
            }
        }
    }
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            if (is_array($value) || is_object($value)) {
                $data[$key] = static::processData($value, $expressions, $expPrefix);
            }
        }
    }
    return $revertToObject ? (object) $data : $data;
}