JSonstreamは、JSONマークアップを読み書きするための低レベルのストリーミングAPIを提供するライブラリです。自動シリアル化や脱派化は行われず、メモリにオブジェクトは作成されません。その結果、オーバーヘッドはほとんどなく、JSONマークアップを大きすぎてメモリに収まることができないこともできます。パーサーはまた、フォールトトレラントであり、誤ったネスティングや欠落コンマなどの特定のエラーから報告および回復することができます。使いやすく、自分のユースケースに適応するのは簡単です。
他のJSONライブラリは一度に多くのことをします。 JSONを解析するとき、彼らは解析するだけでなく、マークアップをオブジェクトツリーに変えるか、リフレクション/rttiを使用して自分のオブジェクトとJSON表現の間に自動的にマッピングします。一方、JSonstreamのパーサーは単なるパーサーです。データで何をするかは完全にあなた次第です。これはまた、クラス/構造体/レコードがJSONの1:1の表現である必要がないことを意味します。これは、既存のJSON APIを使用するときに非常に役立ちます。
他のJSONライブラリは、JSON構造を宣言的に定義することを強制しますが、JSonstreamでは、構造はコードとして定義されているため、より柔軟で表現力豊かになります。たとえば、 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のこのような使用の例を参照してください。
ライブラリは、予測可能なランタイム特性を備えた任意の入力を処理できます。文字列とオブジェクトキーは、メソッドStrBufとKeyBufを使用してチャンクごとに処理できます。したがって、メモリ全体に存在する必要はありません。これらの関数のセマンティクスは、POSIXシステムのread syscallに似ています。
JSONファイルを解析するのに必要な時間はO(n + e*k)で制限されます。ここで、nはバイトの長さ、eは修正されたエラーの数、kは最大営巣の深さです。ほとんどのユースケースでは、最初のエラーを中止することは問題ありません(デフォルトでもあります)。その場合、ランタイムはO(n)になります。メモリ使用量はO(k)によって制限されます。初期化中に最大許容される巣の深さを指定できます。この制限に達すると、パーサーは中止します。
必要に応じて出力をかなり印刷するか、追加の空白のないコンパクトな表現を使用できます。
このリポジトリには、ライブラリのさまざまな言語実装のサブフォルダーがあります。現在、唯一の実装はPascalで記述されていますが、他の実装(例:C)が計画されています。
サブフォルダー:
| フォルダ | 説明 |
|---|---|
| パスカル | JSonstreamのPascal実装 |
このプロジェクトは、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.