JSOnstream-это библиотека, обеспечивающая потоковую API низкого уровня для чтения и написания json. Автоматической сериализации или десериализации не происходит, и в памяти нет объектов. В результате, накладных расходов очень мало, и вы даже можете обрабатывать json charkup слишком большую, чтобы вписаться в память. Сигнал также терпимы к ошибкам и может сообщать и восстанавливаться от определенных ошибок, таких как неправильное гнездование или недостающая запятая. Это легко использовать и адаптироваться к вашим собственным вариантам использования.
Другие библиотеки JSON делают много вещей одновременно. При анализе JSON они не только анализируют, но и превращают разметку в дерево объектов или даже используют отражение/RTTI для автоматической карты между вашими собственными объектами и представлением JSON. С другой стороны, анализатор в JSonstream - просто анализатор. То, что вы делаете с данными, полностью зависит от вас. Это также означает, что ваши классы/структуры/записи не должны быть представлением JSON 1: 1, что может быть очень полезно при работе с существующими API JSON.
В то время как другие библиотеки JSON заставляют вас определять структуру JSON, в JSONSTREAM структура определяется как код, что делает ее намного более гибким и выразительным. Например, если есть значение, которое может быть либо null , либо целым числом, вы можете просто проверить его, вместо того, чтобы объявлять специальный Nullable<int> с кучей перегруженных методов. По мере того, как ваша спецификация JSON становится более сложной, декларативный подход, принятый другими библиотеками, становится трудным для чтения и поддержания, и приводит к большому количеству кода шаблона. В конечном итоге вы пишете код, заполняющий Turing, используя синтаксис шаблона, который не является тем, что вы хотите. С другой стороны, JSOnstream просто позволяет вам использовать язык, заполненный Turing, уже в вашем распоряжении.
Чтение:
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 , и, следовательно, не должны находиться в памяти полностью. Семантика этих функций аналогична read Syscall в системах POSIX.
Время, необходимое для анализа файла JSON, ограничено O (n + e*k), где n - длина в байтах, e - количество исправленных ошибок, а k - максимальная глубина гнездования. Для большинства вариантов использования прерывание первой ошибки в порядке (это также по умолчанию), и в этом случае время выполнения становится O (n). Использование памяти ограничено O (k). Вы можете указать максимально допустимую глубину гнездования во время инициализации. Затем анализатор будет прерван, как только этот предел будет достигнут.
Выход может быть довольно напечатан при желании или использовать компактное представление без дополнительного пробела.
Этот репозиторий имеет подпапки для различных языковых реализаций библиотеки. В настоящее время единственная реализация написана в Паскале, но запланированы другие реализации (например, c).
Подпапки:
| Папка | Описание |
|---|---|
| Паскаль | Pascal реализация 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.