JSonstream adalah perpustakaan yang menyediakan API streaming tingkat rendah untuk membaca dan menulis markup JSON. Tidak ada serialisasi atau deserialisasi otomatis yang terjadi dan tidak ada objek yang dibuat dalam memori. Akibatnya, ada sedikit overhead dan Anda bahkan dapat menangani json markup terlalu besar untuk masuk ke dalam memori. Parser juga toleran terhadap kesalahan dan dapat melaporkan dan memulihkan dari kesalahan tertentu seperti bersarang yang salah atau koma yang hilang. Mudah digunakan dan beradaptasi dengan kasus penggunaan Anda sendiri.
Perpustakaan JSON lainnya melakukan banyak hal sekaligus. Ketika parsing JSON, mereka tidak hanya menguraikan, tetapi juga mengubah markup menjadi pohon objek, atau bahkan menggunakan Reflection/RTTI untuk secara otomatis memetakan antara objek Anda sendiri dan representasi JSON mereka. Parser di jsonstream di sisi lain hanyalah parser. Apa yang Anda lakukan dengan data sepenuhnya terserah Anda. Ini juga berarti bahwa kelas/struktur/catatan Anda tidak harus menjadi representasi 1: 1 dari JSON, yang bisa sangat berguna ketika bekerja dengan API JSON yang ada.
Sedangkan perpustakaan JSON lainnya memaksa Anda untuk mendefinisikan struktur JSON secara deklaratif, dalam JSonstream struktur didefinisikan sebagai kode, yang membuatnya jauh lebih fleksibel dan ekspresif. Misalnya, jika ada nilai yang mungkin null atau bilangan bulat, Anda dapat mengujinya, daripada harus menyatakan tipe Nullable<int> dengan banyak metode yang kelebihan beban. Karena spek JSON Anda menjadi lebih kompleks, pendekatan deklaratif yang diambil oleh perpustakaan lain menjadi sulit untuk dibaca dan dipelihara, dan menghasilkan banyak kode boilerplate. Anda akhirnya menulis kode Turing-Complete menggunakan sintaks template, yang bukan yang Anda inginkan. Jsonstream di sisi lain hanya memungkinkan Anda menggunakan bahasa Turing-Complete yang sudah Anda inginkan.
Membaca:
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 ;Menulis:
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
]
}Temukan lebih banyak contoh di sini.
Perpustakaan ini dapat membaca dan menulis standar berikut:
Ini melekat erat pada standar dan dapat digunakan untuk memvalidasi atau membersihkan markup JSON. Bahkan dapat terus mem -parsing setelah kesalahan, jika diinginkan. Lihat contoh untuk penggunaan seperti itu di Pascal/Example/Jsonecho.
Perpustakaan dapat memproses input sewenang -wenang dengan karakteristik runtime yang dapat diprediksi. String dan kunci objek dapat diproses chunk-by-chunk menggunakan metode StrBuf dan KeyBuf , dan karenanya tidak harus berada dalam memori secara keseluruhan. Semantik fungsi -fungsi ini mirip dengan syscall read pada sistem POSIX.
Waktu yang diperlukan untuk menguraikan file JSON dibatasi oleh O (n + e*k), di mana n adalah panjang dalam byte, E adalah jumlah kesalahan yang dikoreksi dan k adalah kedalaman sarang maksimum. Untuk sebagian besar kasus penggunaan, dibatalkan pada kesalahan pertama baik -baik saja (juga default), dalam hal ini runtime menjadi O (n). Penggunaan memori dibatasi oleh O (k). Anda dapat menentukan kedalaman sarang maksimum yang diijinkan selama inisialisasi. Parser kemudian akan dibatalkan setelah batas ini tercapai.
Output dapat dicetak cukup jika diinginkan atau menggunakan representasi kompak tanpa spasi putih tambahan.
Repositori ini memiliki subfolder untuk berbagai implementasi bahasa perpustakaan. Saat ini, satu -satunya implementasi ditulis dalam Pascal, tetapi implementasi lain (misalnya C) direncanakan.
Subfolder:
| Map | Keterangan |
|---|---|
| Pascal | Implementasi Pascal dari JSonstream |
Proyek ini dilisensikan di bawah lisensi 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.