类 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 |
方法详细信息
定义于: 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;
}
定义于: 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。默认值为 |
返回 | 字符串 |
编码结果。 |
---|---|---|
抛出 | 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);
}
定义于: yii\helpers\BaseJson::errorSummary()
生成验证错误的摘要。
public static 字符串 errorSummary ( $models, $options = [] ) | ||
$models | yii\base\Model|yii\base\Model[] |
要显示其验证错误的模型。 |
$options | 数组 |
标签选项,以名称-值对的形式。以下选项会得到特殊处理
|
返回 | 字符串 |
生成的错误摘要 |
---|
public static function errorSummary($models, $options = [])
{
$showAllErrors = ArrayHelper::remove($options, 'showAllErrors', false);
$lines = self::collectErrors($models, $showAllErrors);
return static::encode($lines);
}
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.');
}
定义于: 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);
}
定义于: 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;
}
注册 或 登录 发表评论。