0 关注者

类 yii\helpers\BaseJson

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

BaseJson 为 yii\helpers\Json 提供具体的实现。

不要使用 BaseJson。 请使用 yii\helpers\Json 代替。

公共属性

隐藏继承的属性

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

属性详情

隐藏继承的属性

$jsonErrorMessages 公共静态属性 (自版本 2.0.7 起可用)

JSON 错误消息列表,分配给常量名称,以便更好地处理 PHP <= 5.5。

public static array $jsonErrorMessages = [
    
'JSON_ERROR_SYNTAX' => '语法错误',
    
'JSON_ERROR_UNSUPPORTED_TYPE' => '类型不支持',
    
'JSON_ERROR_DEPTH' => '已超过最大堆栈深度',
    
'JSON_ERROR_STATE_MISMATCH' => '无效或格式错误的 JSON',
    
'JSON_ERROR_CTRL_CHAR' => '控制字符错误,可能是编码错误',
    
'JSON_ERROR_UTF8' => '格式错误的 UTF-8 字符,可能是编码错误',
]
$keepObjectType 公共静态属性 (自版本 2.0.44 起可用)

避免具有零索引键的对象被编码为数组 Json::encode((object)['test']) 将被编码为对象,而不是数组。 这与 json_encode() 的行为一致。 默认值为 false,以避免任何向后兼容性问题。 为单一目的启用:Json::$keepObjectType = true;

另请参见 yii\web\JsonResponseFormatter 文档,以了解如何为所有 JSON 响应启用此选项。

public static boolean $keepObjectType false
$prettyPrint 公共静态属性 (自版本 2.0.43 起可用)

启用人类可读输出,即美化打印。 这在开发期间调试时可能有用,但在生产环境中不建议使用! 如果 prettyPrintnull(默认值),则传递给 encode 函数的 options 不会更改。

public static boolean|null $prettyPrint null

方法详情

隐藏继承的方法

decode() 公共静态方法

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

public static mixed decode ( $json, $asArray true )
$json string

要解码的 JSON 字符串

$asArray boolean

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

返回值 mixed

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() 公共静态方法

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

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

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

public static string encode ( $value, $options 320 )
$value mixed

要编码的数据。

$options integer

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

返回值 string

编码结果。

抛出 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() public static method (available since version 2.0.14)

生成验证错误的摘要。

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

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

$options array

以名称-值对形式的标签选项。以下选项将被特别处理

  • showAllErrors: boolean,如果设置为 true,则将显示每个属性的每个错误消息,否则只显示每个属性的第一个错误消息。默认为 false
返回值 string

生成的错误摘要

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

            
handleJsonError() protected static method (available since version 2.0.6)

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

protected static void handleJsonError ( $lastError )
$lastError integer

来自 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() public static method (available since version 2.0.4)

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

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

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

public static string htmlEncode ( $value )
$value mixed

要编码的数据

返回值 string

编码结果

抛出 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() protected static method

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

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

要处理的数据

$expressions array

JavaScript 表达式集合

$expPrefix string

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

返回值 mixed

处理后的数据

                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;
}