streaming json encoder เป็นไลบรารี PHP ที่มีชุดคลาสเพื่อช่วยในการเข้ารหัส JSON ในลักษณะสตรีมมิ่ง กล่าวคือ ช่วยให้คุณสามารถเข้ารหัสเอกสาร JSON ทีละบิต แทนที่จะเข้ารหัสทั้งเอกสารในคราวเดียว เมื่อเปรียบเทียบกับฟังก์ชัน json_encode
ในตัว มีข้อดีหลักๆ อยู่ 2 ประการ:
กล่าวอีกนัยหนึ่ง streaming json encoder สามารถให้ประโยชน์สูงสุดเมื่อคุณต้องการจัดการชุดข้อมูลขนาดใหญ่ที่อาจใช้หน่วยความจำมากเกินไปในการประมวลผล
เพื่อเพิ่มความสามารถในการทำงานร่วมกัน ไลบรารียังมีสตรีมที่เข้ากันได้กับ PSR-7 เพื่อใช้กับเฟรมเวิร์กและคำขอ HTTP
เอกสาร API มีอยู่ที่: http://violet.riimu.net/api/streaming-json-encoder/
^1.0
) วิธีที่ง่ายที่สุดในการติดตั้งไลบรารีนี้คือการใช้ Composer เพื่อจัดการการขึ้นต่อกันของคุณ ในการติดตั้งไลบรารีนี้ผ่าน Composer เพียงปฏิบัติตามสองขั้นตอนเหล่านี้:
รับ composer.phar
โดยการรันการติดตั้งบรรทัดคำสั่ง Composer ในรูทโปรเจ็กต์ของคุณ
เมื่อคุณรันสคริปต์การติดตั้งแล้ว คุณควรมีไฟล์ composer.phar
ในโปรเจ็กต์รูทของคุณ และคุณสามารถรันคำสั่งต่อไปนี้:
php composer.phar require "violet/streaming-json-encoder:^1.1"
หลังจากติดตั้งไลบรารีนี้ผ่าน Composer คุณสามารถโหลดไลบรารีโดยรวมไฟล์ vendor/autoload.php
ที่สร้างโดย Composer ระหว่างการติดตั้ง
หากคุณคุ้นเคยกับวิธีใช้ Composer อยู่แล้ว คุณสามารถเพิ่มไลบรารีเป็นการพึ่งพาได้โดยการเพิ่มไฟล์ composer.json
ต่อไปนี้ในโปรเจ็กต์ของคุณ และรันคำสั่ง composer install
:
{
"require" : {
"violet/streaming-json-encoder" : " ^1.1 "
}
}
หากคุณไม่ต้องการใช้ Composer เพื่อโหลดไลบรารี คุณสามารถดาวน์โหลดไลบรารีได้ด้วยตนเองโดยการดาวน์โหลดรุ่นล่าสุดและแยกโฟลเดอร์ src
ไปยังโปรเจ็กต์ของคุณ จากนั้นคุณอาจรวมไฟล์ src/autoload.php
ที่ให้มาเพื่อโหลดคลาสไลบรารี
โปรดทราบว่าการใช้ Composer จะดาวน์โหลดไลบรารี PHP ที่จำเป็นอื่นๆ โดยอัตโนมัติด้วย หากคุณติดตั้งไลบรารีนี้ด้วยตนเอง คุณจะต้องทำให้ไลบรารีที่จำเป็นอื่นๆ เหล่านั้นพร้อมใช้งานด้วย
ไลบรารีนี้นำเสนอ 3 วิธีหลักในการใช้ไลบรารีผ่านคลาส BufferJsonEncoder
, StreamJsonEncoder
และ JsonStream
สตรีมที่เข้ากันได้กับ PSR-7
ตัวเข้ารหัสบัฟเฟอร์มีประโยชน์มากที่สุดเมื่อคุณต้องการสร้างเอกสาร JSON ในลักษณะที่ไม่เกี่ยวข้องกับการส่งผ่านการโทรกลับเพื่อจัดการ JSON ที่สร้างขึ้น
วิธีที่ง่ายที่สุดในการใช้ BufferJsonEncoder
คือการสร้างอินสแตนซ์ด้วยค่า JSON เพื่อเข้ารหัสและเรียกใช้เมธอด 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
ยอมรับ callable เป็นอาร์กิวเมนต์ตัวสร้างที่สอง เมื่อใดก็ตามที่จำเป็นต้องส่งออก JSON การเรียกนี้จะถูกเรียกด้วยสองอาร์กิวเมนต์ ได้แก่ สตริงจริงที่จะส่งออก และประเภทของโทเค็นที่จะส่งออก (ซึ่งเป็นหนึ่งในค่าคง JsonToken
)
หากไม่มีการส่งผ่านการโทร StreamJsonEncoder จะส่งออก JSON โดยใช้คำสั่ง echo ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder StreamJsonEncoder ([ ' array_value ' ]);
$ encoder -> encode ();
เมธอด encode()
ใน StreamJsonEncoder
ส่งคืนจำนวนไบต์ทั้งหมดที่ส่งผ่านไปยังเอาต์พุต ตัวเข้ารหัสนี้ทำให้สะดวก เช่น ในการเขียน 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 );
คลาสสตรีมมี StreamInterface
ที่เข้ากันได้กับ PSR-7 สำหรับการสตรีมเนื้อหา JSON จริงๆ แล้ว มันใช้ 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
และส่งคืนค่า interger 0
เป็นคีย์แรกหรือไม่ส่งคืนค่าใดๆ เลย อ็อบเจ็กต์นั้นจะถูกเข้ารหัสเป็นอาร์เรย์ JSON (โดยไม่คำนึงถึงคีย์อื่นๆ) ออบเจ็กต์อื่นๆ ทั้งหมดที่ใช้งาน Traversable
จะถูกเข้ารหัสเป็นออบเจ็กต์ JSON อย่างไรก็ตาม โปรดทราบว่าหากใช้ตัวเลือกการเข้ารหัส JSON JSON_FORCE_OBJECT
กต์และอาร์เรย์ทั้งหมดจะถูกเข้ารหัสเป็นออบเจ็กต์ JSON
โปรดทราบว่าวัตถุทั้งหมดถูกสำรวจผ่านคำสั่ง foreach
ซึ่งหมายความว่าออบเจ็กต์ Traversable
ทั้งหมดได้รับการเข้ารหัสโดยใช้ค่าที่ส่งคืนโดยตัววนซ้ำ สำหรับออบเจ็กต์อื่นๆ หมายความว่ามีการใช้คุณสมบัติสาธารณะ (ตามพฤติกรรมการวนซ้ำเริ่มต้น)
ค่าอื่นๆ ทั้งหมด (เช่น ค่าว่าง บูลีน ตัวเลข และสตริง) จะได้รับการปฏิบัติเช่นเดียวกับที่ json_encode()
ทำทุกประการ (และในความเป็นจริง ค่าดังกล่าวใช้ในการเข้ารหัสค่าเหล่านั้น)
ทั้ง BufferJsonEncoder
และ StreamJsonEncoder
มีเมธอด setOptions()
เพื่อเปลี่ยนตัวเลือกการเข้ารหัส JSON ตัวเลือกที่ยอมรับจะเหมือนกับตัวเลือกที่ยอมรับโดยฟังก์ชัน json_encode()
ตัวเข้ารหัสยังคงใช้เมธอด json_encode()
ภายในเพื่อเข้ารหัสค่าอื่นที่ไม่ใช่อาร์เรย์หรืออ็อบเจ็กต์ ตัวเลือกบางตัวยังมีผลกระทบเพิ่มเติมต่อตัวเข้ารหัส:
JSON_FORCE_OBJECT
จะบังคับให้อาร์เรย์และออบเจ็กต์ทั้งหมดถูกเข้ารหัสเป็นออบเจ็กต์ JSON ที่คล้ายกับ json_encode()
JSON_PRETTY_PRINT
จะทำให้ตัวเข้ารหัสแสดงช่องว่างเอาต์พุตเพื่อทำให้เอาต์พุตอ่านได้ง่ายขึ้น การเยื้องที่ใช้สามารถเปลี่ยนแปลงได้โดยใช้เมธอด setIndent()
ซึ่งยอมรับอาร์กิวเมนต์สตริงเพื่อใช้เป็นการเยื้องหรือจำนวนเต็มเพื่อระบุจำนวนช่องว่างJSON_PARTIAL_OUTPUT_ON_ERROR
จะทำให้ตัวเข้ารหัสดำเนินการเอาต์พุตต่อไปแม้จะมีข้อผิดพลาดในการเข้ารหัสก็ตาม มิฉะนั้นการเข้ารหัสจะหยุดลงและตัวเข้ารหัสจะส่ง EncodingException
ห้องสมุดนี้เป็นลิขสิทธิ์ (c) 2017-2022 Riikka Kalliomäki
ดูใบอนุญาตสำหรับข้อมูลใบอนุญาตและการคัดลอก