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 配列 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

メソッド詳細

継承されたメソッドを隠す

decode() public static method

定義元: 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;
}

            
encode() public static method

定義元: 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 を参照してください。デフォルトは 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() public static method (バージョン 2.0.14 から利用可能)

定義元: yii\helpers\BaseJson::errorSummary()

検証エラーのサマリーを生成します。

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

バリデーションエラーを表示するモデル(複数可)。

$options 配列

名前と値のペアで指定するタグオプション。以下のオプションは特別に処理されます。

  • showAllErrors: boolean。trueに設定すると、各属性のすべてのエラーメッセージが表示されます。それ以外の場合は、各属性の最初のエラーメッセージのみが表示されます。デフォルトはfalseです。
戻り値 文字列

生成されたエラーサマリー

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

            
handleJsonError() protected static メソッド (バージョン 2.0.6 から利用可能)

定義元: 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.');
}

            
htmlEncode() public static メソッド (バージョン 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() protected static メソッド

定義元: 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;
}