类 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 |
属性详情
JSON 错误消息列表,分配给常量名称,以便更好地处理 PHP <= 5.5。
'JSON_ERROR_SYNTAX' => '语法错误',
'JSON_ERROR_UNSUPPORTED_TYPE' => '类型不支持',
'JSON_ERROR_DEPTH' => '已超过最大堆栈深度',
'JSON_ERROR_STATE_MISMATCH' => '无效或格式错误的 JSON',
'JSON_ERROR_CTRL_CHAR' => '控制字符错误,可能是编码错误',
'JSON_ERROR_UTF8' => '格式错误的 UTF-8 字符,可能是编码错误',
]
避免具有零索引键的对象被编码为数组 Json::encode((object)['test'])
将被编码为对象,而不是数组。 这与 json_encode()
的行为一致。 默认值为 false,以避免任何向后兼容性问题。 为单一目的启用:Json::$keepObjectType = true;
另请参见 yii\web\JsonResponseFormatter 文档,以了解如何为所有 JSON 响应启用此选项。
启用人类可读输出,即美化打印。 这在开发期间调试时可能有用,但在生产环境中不建议使用! 如果 prettyPrint
为 null
(默认值),则传递给 encode
函数的 options
不会更改。
方法详情
将给定的 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;
}
将给定的值编码为 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。默认值为 |
返回值 | 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);
}
生成验证错误的摘要。
public static string errorSummary ( $models, $options = [] ) | ||
$models | yii\base\Model|yii\base\Model[] |
要显示其验证错误的模型。 |
$options | array |
以名称-值对形式的标签选项。以下选项将被特别处理
|
返回值 | string |
生成的错误摘要 |
---|
public static function errorSummary($models, $options = [])
{
$showAllErrors = ArrayHelper::remove($options, 'showAllErrors', false);
$lines = self::collectErrors($models, $showAllErrors);
return static::encode($lines);
}
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.');
}
将给定的值编码为 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);
}
在将数据发送到 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;
}
注册 或 登录 评论。