O JSOSTEAM é uma biblioteca que fornece uma API de streaming de baixo nível para ler e escrever a Markup JSON. Nenhuma serialização automática ou desserialização ocorre e nenhum objetivo é criado na memória. Como resultado, há muito pouca sobrecarga e você pode até lidar com a marcação JSON demais para se encaixar na memória. O analisador também é tolerante a falhas e pode relatar e se recuperar de certos erros, como ninho incorreto ou uma vírgula ausente. É fácil de usar e se adaptar aos seus próprios casos de uso.
Outras bibliotecas JSON fazem muitas coisas ao mesmo tempo. Ao analisar o JSON, eles não apenas analisam, mas também transformam a marcação em uma árvore de objetos, ou até usam a reflexão/rtti para mapear automaticamente seus próprios objetos e a representação JSON. O analisador em Jsensteam, por outro lado, é apenas um analisador. O que você faz com os dados depende de você. Isso também significa que suas classes/estruturas/registros não precisam ser uma representação 1: 1 do JSON, que pode ser muito útil ao trabalhar com as APIs JSON existentes.
Enquanto outras bibliotecas JSON forçam você a definir a estrutura JSON declarativamente, em JSonsteam a estrutura é definida como código, o que a torna muito mais flexível e expressiva. Por exemplo, se houver um valor que possa ser null ou um número inteiro, você poderá simplesmente testá -lo, em vez de declarar um digite Nullable<int> especial com um monte de métodos sobrecarregados. À medida que sua especificação JSON se torna mais complexa, a abordagem declarativa adotada por outras bibliotecas se torna difícil de ler e manter e resulta em muitos código de caldeira. Você acaba escrevendo o código Turing-Coplete usando a sintaxe do modelo, o que não é o que você deseja. O JSOSTEAM, por outro lado, permite que você use o idioma Turing-complete já à sua disposição.
Leitura:
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 ;Escrita:
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
]
}Encontre mais exemplos aqui.
Esta biblioteca pode ler e escrever os seguintes padrões:
Adere intimamente os padrões e pode ser usado para validar ou higienizar a marcação JSON. Pode até continuar analisando após um erro, se desejado. Veja um exemplo para esse uso em Pascal/exemplo/jsonecho.
A biblioteca pode processar entradas arbitrárias com características previsíveis de tempo de execução. Strings e teclas de objeto podem ser processadas, Chunk-By-Chunk usando os métodos StrBuf e KeyBuf e, portanto, não precisam residir na memória na íntegra. A semântica dessas funções é semelhante ao Syscall read nos sistemas POSIX.
O tempo necessário para analisar um arquivo JSON é limitado por O (n + e*k), onde n é o comprimento em bytes, E é o número de erros corrigidos e k é a profundidade máxima de nidificação. Para a maioria dos casos de uso, abortar o primeiro erro é bom (também é o padrão); nesse caso, o tempo de execução se torna O (n). O uso da memória é delimitado por O (K). Você pode especificar uma profundidade máxima de ninho permitida durante a inicialização. O analisador abortará assim que esse limite for atingido.
A saída pode ser bastante impressa, se desejado ou usar uma representação compacta sem espaço em branco extra.
Este repositório possui subpastas para as várias implementações de idiomas da biblioteca. Atualmente, a única implementação é escrita em Pascal, mas outras implementações (por exemplo, C) estão planejadas.
Subpastas:
| Pasta | Descrição |
|---|---|
| Pascal | Implementação Pascal de JSonsteam |
Este projeto está licenciado sob a licença do 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.