streaming json encoderは、ストリーミング方式で JSON をエンコードするのに役立つ一連のクラスを提供する PHP ライブラリです。つまり、ドキュメント全体を一度にエンコードするのではなく、少しずつ JSON ドキュメントをエンコードできるようになります。組み込みのjson_encode
関数と比較すると、次の 2 つの主な利点があります。
つまり、 streaming json encoder処理に大量のメモリを消費する可能性がある大規模なデータ セットを処理する必要がある場合に、最大の利点を提供できます。
相互運用性を高めるために、ライブラリはフレームワークおよび HTTP リクエストで使用する PSR-7 互換ストリームも提供します。
API ドキュメントは http://violet.riimu.net/api/streaming-json-encoder/ から入手できます。
^1.0
) このライブラリをインストールする最も簡単な方法は、Composer を使用して依存関係を処理することです。 Composer 経由でこのライブラリをインストールするには、次の 2 つの手順に従ってください。
プロジェクト ルートで Composer コマンドライン インストールを実行して、 composer.phar
を取得します。
インストール スクリプトを実行すると、 composer.phar
ファイルがプロジェクト ルートに存在し、次のコマンドを実行できるようになります。
php composer.phar require "violet/streaming-json-encoder:^1.1"
Composer 経由でこのライブラリをインストールした後、インストール中に Composer によって生成されたvendor/autoload.php
ファイルを含めることでライブラリをロードできます。
Composer の使用方法にすでに慣れている場合は、次のcomposer.json
ファイルをプロジェクトに追加し、 composer install
コマンドを実行することで、ライブラリを依存関係として追加することもできます。
{
"require" : {
"violet/streaming-json-encoder" : " ^1.1 "
}
}
Composer を使用してライブラリをロードしたくない場合は、最新リリースをダウンロードし、 src
フォルダーをプロジェクトに抽出することで、ライブラリを手動でダウンロードすることもできます。次に、提供されたsrc/autoload.php
ファイルをインクルードして、ライブラリ クラスをロードできます。
Composer を使用すると、他の必要な PHP ライブラリも自動的にダウンロードされることに注意してください。このライブラリを手動でインストールする場合は、他の必要なライブラリも使用できるようにする必要があります。
このライブラリは、クラスBufferJsonEncoder
、 StreamJsonEncoder
、および PSR-7 互換ストリームJsonStream
を介してライブラリを使用する 3 つの主な方法を提供します。
バッファー エンコーダーは、生成された JSON を処理するコールバックを渡す必要のない方法で JSON ドキュメントを生成する必要がある場合に最も役立ちます。
BufferJsonEncoder
使用する最も簡単な方法は、エンコードする JSON 値を使用して BufferJsonEncoder をインスタンス化し、 encode()
メソッドを呼び出して出力全体を文字列として返すことです。
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ([ ' array_value ' ]);
echo $ encoder -> encode ();
ただし、このエンコーダを使用する最も便利な方法は、それをイテレータとして使用することです。エンコーダーはIterator
インターフェイスを実装しているため、生成された JSON を foreach ループで単純にループできます。
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( range ( 0 , 10 ));
foreach ( $ encoder as $ string ) {
echo $ string ;
}
エンコーダーが値の反復子をサポートしていることにも注目してください。さらに、エンコーダーに渡されたクロージャーも呼び出され、代わりに戻り値が値として使用されます。前の例は次のように書くこともできます。
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( function () {
for ( $ i = 0 ; $ i <= 10 ; $ i ++) {
yield $ i ;
}
});
foreach ( $ encoder as $ string ) {
echo $ string ;
}
補足として、エンコーダーはJsonSerializable
インターフェースも尊重し、インターフェースを実装するオブジェクトに対してjsonSerialize
呼び出します。
ストリーム エンコーダーは、同じ抽象クラスを拡張するため、 BufferJsonEncoder
と非常によく似た動作をします。ただし、主な違いは、JSON 出力の受け渡しを処理する方法にあります。
StreamJsonEncoder
、2 番目のコンストラクター引数として呼び出し可能オブジェクトを受け入れます。 JSON を出力する必要がある場合は常に、この呼び出し可能ファイルは 2 つの引数、出力する実際の文字列と出力するトークンのタイプ ( JsonToken
定数の 1 つ) を指定して呼び出されます。
callable が渡されない場合、StreamJsonEncoder は単に echo ステートメントを使用して JSON を出力します。例えば:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder ([ ' array_value ' ]);
$ encoder -> encode ();
StreamJsonEncoder
のencode()
メソッドは、出力に渡された合計バイト数を返します。このエンコーダーを使用すると、たとえば、ストリーミング方式で JSON をファイルに書き込むことが容易になります。例えば:
<?php
require ' vendor/autoload.php ' ;
$ fp = fopen ( ' test.json ' , ' wb ' );
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder (
range ( 1 , 100 ),
function ( $ json ) use ( $ fp ) {
fwrite ( $ fp , $ json );
}
);
$ encoder -> encode ();
fclose ( $ fp );
ストリーム クラスは、JSON コンテンツをストリーミングするための PSR-7 互換のStreamInterface
を提供します。実際にはBufferJsonEncoder
使用して難しい作業を実行し、呼び出しをストリームのような方法で単純にラップします。
JsonStream
のコンストラクターは、JSON としてエンコードする値、またはBufferJsonEncoder
(エンコード オプションを設定できる) のインスタンスを受け入れます。その後、PSR-7 インターフェイスによって提供されるメソッドを使用してストリームを操作できます。例えば:
<?php
require ' vendor/autoload.php ' ;
$ iterator = function () {
foreach ( new DirectoryIterator ( __DIR__ ) as $ file ) {
yield $ file -> getFilename ();
}
};
$ encoder = ( new Violet StreamingJsonEncoder BufferJsonEncoder ( $ iterator ))
-> setOptions ( JSON_PRETTY_PRINT );
$ stream = new Violet StreamingJsonEncoder JsonStream ( $ encoder );
while (! $ stream -> eof ()) {
echo $ stream -> read ( 1024 * 8 );
}
PSR-7 ストリームの詳細については、PSR-7 のドキュメントを参照してください。
多くの点で、 streaming json encoder主にjson_encode()
のドロップイン置き換えとして機能することを目的としています。ただし、エンコーダーは大規模なデータ セットを処理することを目的としているため、オブジェクトと配列の処理方法にはいくつかの顕著な違いがあります。
まず、オブジェクトをエンコードする方法を決定するために、エンコーダーは次の方法でオブジェクト値を解決しようとします。
JsonSerializable
実装するオブジェクトの場合、実装されたメソッドjsonSerialize()
が呼び出され、代わりに戻り値が使用されます。Closure
が呼び出され、代わりに戻り値が使用されます。ただし、他の呼び出し可能ファイルはこの方法で呼び出されません。返された値は、それ以上解決できなくなるまでループされます。その後、配列またはオブジェクトを配列としてエンコードするかオブジェクトとしてエンコードするかが決定されます。次のロジックが使用されます。
Traversable
実装しており、最初のキーとして整数0
を返すか、値をまったく返さない場合、そのオブジェクトは (他のキーに関係なく) JSON 配列としてエンコードされます。 Traversable
実装する他のすべてのオブジェクトは、JSON オブジェクトとしてエンコードされます。ただし、JSON エンコード オプションJSON_FORCE_OBJECT
を使用すると、すべてのオブジェクトと配列が JSON オブジェクトとしてエンコードされることに注意してください。
すべてのオブジェクトはforeach
ステートメントを介して走査されることに注意してください。これは、すべてのTraversable
オブジェクトがイテレータによって返された値を使用してエンコードされることを意味します。他のオブジェクトの場合、これはパブリック プロパティが (デフォルトの反復動作に従って) 使用されることを意味します。
他のすべての値 (つまり、null、ブール値、数値、文字列) は、 json_encode()
とまったく同じ方法で処理されます (実際、これらの値をエンコードするために使用されます)。
BufferJsonEncoder
とStreamJsonEncoder
両方に、JSON エンコード オプションを変更するメソッドsetOptions()
があります。受け入れられるオプションは、 json_encode()
関数で受け入れられるオプションと同じです。エンコーダーは引き続き内部でjson_encode()
メソッドを使用して、配列またはオブジェクト以外の値をエンコードします。いくつかのオプションもエンコーダーに追加の影響を与えます。
JSON_FORCE_OBJECT
を使用すると、すべての配列とオブジェクトがjson_encode()
と同様の JSON オブジェクトとして強制的にエンコードされます。JSON_PRETTY_PRINT
を使用すると、エンコーダーは出力を読みやすくするために空白を出力します。使用されるインデントは、インデントとして使用する文字列引数またはスペースの数を示す整数のいずれかを受け入れるメソッドsetIndent()
を使用して変更できます。JSON_PARTIAL_OUTPUT_ON_ERROR
を使用すると、エンコード エラーにもかかわらず、エンコーダーは出力を続行します。それ以外の場合、エンコードは停止し、エンコーダーはEncodingException
をスローします。 このライブラリの著作権は 2017-2022 Riikka Kalliomäki にあります。
ライセンスとコピーの情報については、「ライセンス」を参照してください。