streaming json encoder adalah pustaka PHP yang menyediakan sekumpulan kelas untuk membantu pengkodean JSON secara streaming, yaitu memungkinkan Anda untuk menyandikan dokumen JSON sedikit demi sedikit daripada menyandikan seluruh dokumen sekaligus. Dibandingkan dengan fungsi json_encode
bawaan, ada dua keunggulan utama:
Dengan kata lain, streaming json encoder dapat memberikan manfaat terbesar saat Anda perlu menangani kumpulan data besar yang mungkin memerlukan terlalu banyak memori untuk diproses.
Untuk meningkatkan interoperabilitas, perpustakaan juga menyediakan aliran yang kompatibel dengan PSR-7 untuk digunakan dengan kerangka kerja dan permintaan HTTP.
Dokumentasi API tersedia di: http://violet.riimu.net/api/streaming-json-encoder/
^1.0
) Cara termudah untuk menginstal perpustakaan ini adalah dengan menggunakan Komposer untuk menangani dependensi Anda. Untuk menginstal perpustakaan ini melalui Komposer, cukup ikuti dua langkah berikut:
Dapatkan composer.phar
dengan menjalankan instalasi baris perintah Composer di root proyek Anda.
Setelah Anda menjalankan skrip instalasi, Anda harus memiliki file composer.phar
di root proyek Anda dan Anda dapat menjalankan perintah berikut:
php composer.phar require "violet/streaming-json-encoder:^1.1"
Setelah menginstal perpustakaan ini melalui Komposer, Anda dapat memuat perpustakaan dengan menyertakan file vendor/autoload.php
yang dihasilkan oleh Komposer selama instalasi.
Jika Anda sudah familiar dengan cara menggunakan Composer, Anda dapat menambahkan perpustakaan sebagai dependensi dengan menambahkan file composer.json
berikut ke proyek Anda dan menjalankan perintah composer install
:
{
"require" : {
"violet/streaming-json-encoder" : " ^1.1 "
}
}
Jika Anda tidak ingin menggunakan Komposer untuk memuat pustaka, Anda juga dapat mengunduh pustaka secara manual dengan mengunduh rilis terbaru dan mengekstrak folder src
ke proyek Anda. Anda kemudian dapat memasukkan file src/autoload.php
yang disediakan untuk memuat kelas perpustakaan.
Harap dicatat bahwa menggunakan Komposer juga akan secara otomatis mengunduh pustaka PHP lain yang diperlukan. Jika Anda menginstal perpustakaan ini secara manual, Anda juga perlu menyediakan perpustakaan lain yang diperlukan tersebut.
Pustaka ini menawarkan 3 cara utama yang berbeda untuk menggunakan pustaka melalui kelas BufferJsonEncoder
, StreamJsonEncoder
dan aliran JsonStream
yang kompatibel dengan PSR-7.
Buffer encoder paling berguna ketika Anda perlu membuat dokumen JSON dengan cara yang tidak melibatkan penerusan callback untuk menangani JSON yang dihasilkan.
Cara termudah untuk menggunakan BufferJsonEncoder
adalah dengan membuat instance dengan nilai JSON untuk menyandikan dan memanggil metode encode()
untuk mengembalikan seluruh output sebagai string:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ([ ' array_value ' ]);
echo $ encoder -> encode ();
Namun, cara paling berguna untuk menggunakan pembuat enkode ini adalah dengan menggunakannya sebagai iterator. Saat pembuat enkode mengimplementasikan antarmuka Iterator
, Anda cukup mengulang JSON yang dihasilkan dengan perulangan foreach:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ( range ( 0 , 10 ));
foreach ( $ encoder as $ string ) {
echo $ string ;
}
Perlu juga dicatat bahwa pembuat enkode mendukung iterator untuk nilai. Terlebih lagi, penutupan apa pun yang diteruskan ke pembuat enkode juga akan dipanggil dan nilai yang dikembalikan akan digunakan sebagai nilainya. Contoh sebelumnya juga bisa ditulis sebagai:
<?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 ;
}
Sebagai catatan tambahan, pembuat enkode juga akan menghormati antarmuka JsonSerializable
dan akan memanggil jsonSerialize
untuk objek yang mengimplementasikan antarmuka tersebut.
Encoder aliran bekerja sangat mirip dengan BufferJsonEncoder
karena mereka memperluas kelas abstrak yang sama. Namun, perbedaan utamanya terletak pada cara mereka menangani penerusan keluaran JSON.
StreamJsonEncoder
menerima callable sebagai argumen konstruktor kedua. Setiap kali JSON perlu dikeluarkan, callable ini dipanggil dengan dua argumen, string aktual yang akan dikeluarkan dan jenis token yang akan dikeluarkan (yang merupakan salah satu konstanta JsonToken
).
Jika tidak ada callable yang diteruskan, StreamJsonEncoder hanya akan mengeluarkan JSON menggunakan pernyataan echo. Misalnya:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder ([ ' array_value ' ]);
$ encoder -> encode ();
Metode encode()
di StreamJsonEncoder
mengembalikan jumlah total byte yang diteruskan ke output. Encoder ini memudahkan, misalnya, untuk menulis JSON ke file secara streaming. Misalnya:
<?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 );
Kelas aliran menyediakan StreamInterface
yang kompatibel dengan PSR-7 untuk streaming konten JSON. Ini sebenarnya menggunakan BufferJsonEncoder
untuk melakukan kerja keras dan hanya membungkus panggilan dalam aliran seperti mode.
Konstruktor JsonStream
menerima nilai untuk dikodekan sebagai JSON atau turunan BufferJsonEncoder
(yang memungkinkan Anda mengatur opsi pengkodean). Anda kemudian dapat mengoperasikan streaming menggunakan metode yang disediakan oleh antarmuka PSR-7. Misalnya:
<?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 );
}
Untuk informasi lebih lanjut tentang aliran PSR-7, silakan merujuk ke dokumentasi PSR-7.
Dalam banyak hal, streaming json encoder dimaksudkan untuk berfungsi sebagian besar sebagai pengganti json_encode()
. Namun, karena encoder ditujukan untuk menangani kumpulan data yang besar, terdapat beberapa perbedaan penting dalam cara encoder menangani objek dan array.
Pertama, untuk menentukan cara menyandikan suatu objek, pembuat enkode akan mencoba menyelesaikan nilai objek dengan cara berikut:
JsonSerializable
metode yang diimplementasikan jsonSerialize()
dipanggil dan nilai kembalian digunakan sebagai gantinya.Closure
apa pun akan dipanggil dan nilai kembalian akan digunakan sebagai gantinya. Namun, tidak ada pemanggilan lain yang dipanggil dengan cara ini.Nilai yang dikembalikan akan diulang hingga tidak dapat diselesaikan lebih lanjut. Setelah itu, keputusan dibuat apakah array atau objek dikodekan sebagai array atau sebagai objek. Logika berikut digunakan:
Traversable
dan mengembalikan interger 0
sebagai kunci pertama atau tidak mengembalikan nilai sama sekali, maka objek tersebut akan dikodekan sebagai array JSON (terlepas dari kunci lainnya). Semua objek lain yang mengimplementasikan Traversable
dikodekan sebagai objek JSON. Namun perlu diperhatikan bahwa jika opsi pengkodean JSON JSON_FORCE_OBJECT
digunakan, semua objek dan array dikodekan sebagai objek JSON.
Perhatikan bahwa semua objek dilintasi melalui pernyataan foreach
. Artinya semua objek Traversable
dikodekan menggunakan nilai yang dikembalikan oleh iterator. Untuk objek lain, ini berarti properti publik digunakan (sesuai perilaku iterasi default).
Semua nilai lainnya (yaitu null, boolean, angka, dan string) diperlakukan dengan cara yang persis sama seperti yang dilakukan json_encode()
(dan faktanya, nilai tersebut digunakan untuk menyandikan nilai tersebut).
Baik BufferJsonEncoder
dan StreamJsonEncoder
memiliki metode setOptions()
untuk mengubah opsi pengkodean JSON. Opsi yang diterima sama dengan yang diterima oleh fungsi json_encode()
. Pembuat enkode masih secara internal menggunakan metode json_encode()
untuk menyandikan nilai selain array atau objek. Beberapa opsi juga memiliki efek tambahan pada pembuat enkode:
JSON_FORCE_OBJECT
akan memaksa semua array dan objek dikodekan sebagai objek JSON yang mirip dengan json_encode()
.JSON_PRETTY_PRINT
menyebabkan pembuat enkode mengeluarkan spasi putih agar keluaran lebih mudah dibaca. Indentasi yang digunakan dapat diubah menggunakan metode setIndent()
yang menerima argumen string untuk digunakan sebagai indent atau bilangan bulat untuk menunjukkan jumlah spasi.JSON_PARTIAL_OUTPUT_ON_ERROR
akan menyebabkan pembuat enkode melanjutkan keluaran meskipun terjadi kesalahan penyandian. Jika tidak, pengkodean akan terhenti dan pembuat enkode akan menampilkan EncodingException
. Perpustakaan ini adalah Hak Cipta (c) 2017-2022 Riikka Kalliomäki.
Lihat LISENSI untuk informasi lisensi dan penyalinan.