クラス 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 | 配列 | PHP <= 5.5 のより良い処理のために、定数名に割り当てられた JSON エラーメッセージのリスト。 | yii\helpers\BaseJson |
$keepObjectType | ブール値 | ゼロから始まるキーを持つオブジェクトが配列としてエンコードされるのを防ぎます。Json::encode((object)['test']) は、配列ではなくオブジェクトとしてエンコードされます。 |
yii\helpers\BaseJson |
$prettyPrint | ブール値|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 |
メソッド詳細
定義元: yii\helpers\BaseJson::decode()
指定されたJSON文字列をPHPのデータ構造にデコードします。
public static mixed 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://www.php.net/manual/ja/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 string 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);
}
定義元: yii\helpers\BaseJson::handleJsonError()
encode() および decode() エラーを、それぞれのエラーメッセージと共に例外をスローすることにより処理します。
protected static void 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;
}
サインアップ または ログイン してコメントしてください。