Jsonstream은 JSON 마크 업을 읽고 쓰는 데 저수준 스트리밍 API를 제공하는 라이브러리입니다. 자동 직렬화 또는 사산화가 발생하지 않으며 메모리에는 객체가 생성되지 않습니다. 결과적으로 오버 헤드가 거의 없으며 JSON 마크 업이 너무 커서 메모리에 맞지 않을 수도 있습니다. 파서는 또한 결함이 없으며 잘못된 중첩 또는 누락 된 쉼표와 같은 특정 오류에서보고하고 복구 할 수 있습니다. 사용하기 쉽고 자신의 사용 사례에 적응합니다.
다른 JSON 라이브러리는 한 번에 많은 일을합니다. JSON을 구문 분석 할 때는 마크 업을 개체 트리로 바꾸거나 반사/RTTI를 사용하여 자신의 객체와 JSON 표현 사이에 자동으로 매핑됩니다. 반면에 Jsonstream의 파서는 단지 파서입니다. 당신이 데이터로하는 일은 전적으로 당신에게 달려 있습니다. 또한 클래스/structs/레코드가 JSON의 1 : 1 표현 일 필요는 없으며 기존 JSON API와 함께 작업 할 때 매우 유용 할 수 있습니다.
다른 JSON 라이브러리는 JSON 구조를 선언적으로 정의하도록 강요하는 반면, JSONSTREM에서 구조는 코드로 정의되어 훨씬 유연하고 표현력이 있습니다. 예를 들어, null 또는 정수 일 수있는 값이있는 경우, 과부하 된 메소드가있는 특별한 Nullable<int> 유형을 선언하지 않고 간단히 테스트 할 수 있습니다. JSON 사양이 더욱 복잡 해짐에 따라 다른 라이브러리가 취한 선언적 접근 방식은 읽고 유지하기가 어려워지고 많은 보일러 플레이트 코드가 발생합니다. 당신은 템플릿 구문을 사용하여 튜링-완성 코드를 작성하게됩니다. 반면에 Jsonstream은 이미 당신의 처분에 튜링-완성 언어를 사용할 수있게 해줍니다.
독서:
var
s: string;
i: integer;
...
begin
Stream := TStringStream.Create( ' ["Hello", "World", 42] ' );
Reader := TJsonReader.Create(Stream);
if Reader.List then
while Reader.Advance <> jsListEnd do
begin
if Reader.Str(s) then
WriteLn(s)
else if Reader.Number(i) then
WriteLn(i)
end ;
end ;글쓰기:
begin
Stream := TIOStream.Create(iosOutput);
Writer := TJsonWriter.Create(Stream,[],true);
Writer.Dict;
Writer.Key( ' Hello ' );
Writer.Str( ' World ' );
Writer.Key( ' Flag ' );
Writer.Bool(true);
Writer.Key( ' Numbers ' );
Writer.List;
Writer.Number( 1 );
Writer.Number( 2 );
Writer.Number( 3 );
Writer.ListEnd;
Writer.DictEnd;
end ;=>
{
"Hello" : " World " ,
"Flag" : true ,
"Numbers" : [
1 ,
2 ,
3
]
}여기에서 더 많은 예를 찾으십시오.
이 라이브러리는 다음 표준을 읽고 쓸 수 있습니다.
표준에 밀접하게 준수하며 JSON 마크 업을 검증하거나 위생하는 데 사용될 수 있습니다. 원한다면 오류 후에도 계속 구문 분석 할 수도 있습니다. Pascal/Example/Jsonecho의 이러한 사용에 대한 예를 참조하십시오.
라이브러리는 예측 가능한 런타임 특성으로 임의의 입력을 처리 할 수 있습니다. 문자열 및 객체 키는 Methods StrBuf 및 KeyBuf 사용하여 청크 바이 크기를 처리 할 수 있으므로 전체적으로 메모리에 상주 할 필요가 없습니다. 이러한 기능의 의미론은 POSIX 시스템의 read SYSCALL과 유사합니다.
JSON 파일을 구문 분석하는 데 필요한 시간은 O (n + e*k)로 제한됩니다. 여기서 n은 바이트의 길이, e는 수정 된 오차의 수이고 k는 최대 중첩 깊이입니다. 대부분의 사용 사례의 경우 첫 번째 오류를 중단하는 것은 정상입니다 (기본값도 마찬가지).이 경우 런타임이 O (N)가됩니다. 메모리 사용량은 O (k)로 제한됩니다. 초기화 중에 최대 허용 중첩 깊이를 지정할 수 있습니다. 그런 다음이 한도에 도달하면 파서가 중단됩니다.
원하는 경우 출력을 인쇄하거나 여분의 공백이없는 소형 표현을 사용할 수 있습니다.
이 저장소에는 라이브러리의 다양한 언어 구현을위한 하위 폴더가 있습니다. 현재 유일한 구현은 Pascal로 작성되었지만 다른 구현 (예 : C)이 계획되어 있습니다.
하위 폴더 :
| 접는 사람 | 설명 |
|---|---|
| 파스칼 | Jsonstream의 파스칼 구현 |
이 프로젝트는 MIT 라이센스에 따라 라이센스가 부여됩니다.
Copyright 2021 Philip Zander
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.