JSonstream是一個庫,提供了用於閱讀和寫入JSON MARKUP的低級流API。沒有發生自動序列化或避難所化,也沒有在內存中創建對象。結果,開銷很少,您甚至可以處理JSON標記太大而無法適應記憶。解析器也是容錯的,可以報告並從某些錯誤(例如嵌套或缺失的逗號)等某些錯誤中恢復。它易於使用並適應您自己的用例。
其他JSON庫一次做很多事情。解析JSON時,它們不僅可以解析,還可以將標記變成對象樹,甚至使用反射/RTTI自動映射您自己的對象和JSON表示。另一方面,jsonstream中的解析器只是解析器。您對數據的處理完全取決於您。這也意味著您的類/結構/記錄不一定是JSON的1:1表示,在使用現有JSON API時,這可能非常有用。
而其他JSON庫則迫使您聲明地定義JSON結構,而在JSonstream中,該結構定義為代碼,這使其更加靈活和表現力。例如,如果有一個可能為null或整數的值,則可以簡單地測試它,而不必聲明具有一堆超載方法的特殊Nullable<int>類型。隨著您的JSON規格變得更加複雜,其他庫採用的聲明方法變得難以閱讀和維護,並導致許多樣板代碼。您最終使用模板語法編寫Turing-Complete代碼,這不是您想要的。另一方面,jsonstream只能讓您使用已經可以使用的Turing-Complete語言。
閱讀:
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/示例/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.