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.