streaming json encoder 는 스트리밍 방식으로 JSON을 인코딩하는 데 도움이 되는 클래스 세트를 제공하는 PHP 라이브러리입니다. 즉, 전체 문서를 한 번에 인코딩하는 대신 JSON 문서를 비트 단위로 인코딩할 수 있습니다. 내장된 json_encode
함수와 비교하면 두 가지 주요 장점이 있습니다.
즉, streaming json encoder 처리하는 데 너무 많은 메모리를 차지할 수 있는 대규모 데이터 세트를 처리해야 할 때 가장 큰 이점을 제공할 수 있습니다.
상호 운용성을 높이기 위해 라이브러리는 프레임워크 및 HTTP 요청과 함께 사용할 수 있는 PSR-7 호환 스트림도 제공합니다.
API 문서는 http://violet.riimu.net/api/streaming-json-encoder/에서 확인할 수 있습니다.
^1.0
) 이 라이브러리를 설치하는 가장 쉬운 방법은 Composer를 사용하여 종속성을 처리하는 것입니다. Composer를 통해 이 라이브러리를 설치하려면 다음 두 단계를 따르십시오.
프로젝트 루트에서 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 값으로 인스턴스화하여 인코딩하고 encode()
메서드를 호출하여 전체 출력을 문자열로 반환하는 것입니다.
<?php
require ' vendor/autoload.php ' ;
$ encoder = new Violet StreamingJsonEncoder BufferJsonEncoder ([ ' array_value ' ]);
echo $ encoder -> encode ();
그러나 이 인코더를 사용하는 가장 유용한 방법은 반복자로 사용하는 것입니다. 인코더가 Iterator
인터페이스를 구현하므로 foreach 루프를 사용하여 생성된 JSON을 간단히 반복할 수 있습니다.
<?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
는 콜러블을 두 번째 생성자 인수로 허용합니다. JSON을 출력해야 할 때마다 이 콜러블은 출력할 실제 문자열과 출력할 토큰 유형( JsonToken
상수 중 하나)이라는 두 개의 인수를 사용하여 호출됩니다.
콜러블이 전달되지 않으면 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
을 발생시킵니다. 이 라이브러리의 저작권은 (c) 2017-2022 Riikka Kalliomäki입니다.
라이센스 및 복사 정보는 LICENSE를 참조하세요.