fast-json-stringify secara signifikan lebih cepat daripada JSON.stringify()
untuk muatan kecil. Keunggulan kinerjanya menyusut seiring bertambahnya muatan Anda. Ini berpasangan dengan baik dengan flatstr , yang memicu pengoptimalan V8 yang meningkatkan kinerja ketika akhirnya mengonversi string menjadi Buffer
.
fast-json-stringify memerlukan input JSON Schema Draft 7 untuk menghasilkan fungsi stringify
yang cepat.
EX41S-SSD, Intel Core i7, 4Ghz, 64GB RAM, 4C/8T, SSD
.v18.12.1
FJS creation x 4,129 ops/sec ±0.82% (92 runs sampled)
CJS creation x 184,196 ops/sec ±0.12% (97 runs sampled)
AJV Serialize creation x 61,130,591 ops/sec ±0.40% (92 runs sampled)
JSON.stringify array x 5,057 ops/sec ±0.10% (100 runs sampled)
fast-json-stringify array default x 6,243 ops/sec ±0.14% (98 runs sampled)
fast-json-stringify array json-stringify x 6,261 ops/sec ±0.30% (99 runs sampled)
compile-json-stringify array x 6,842 ops/sec ±0.18% (96 runs sampled)
AJV Serialize array x 6,964 ops/sec ±0.11% (95 runs sampled)
JSON.stringify large array x 248 ops/sec ±0.07% (90 runs sampled)
fast-json-stringify large array default x 99.96 ops/sec ±0.22% (74 runs sampled)
fast-json-stringify large array json-stringify x 248 ops/sec ±0.07% (90 runs sampled)
compile-json-stringify large array x 317 ops/sec ±0.09% (89 runs sampled)
AJV Serialize large array x 111 ops/sec ±0.07% (33 runs sampled)
JSON.stringify long string x 16,002 ops/sec ±0.09% (98 runs sampled)
fast-json-stringify long string x 15,979 ops/sec ±0.09% (96 runs sampled)
compile-json-stringify long string x 15,952 ops/sec ±0.31% (97 runs sampled)
AJV Serialize long string x 21,416 ops/sec ±0.08% (98 runs sampled)
JSON.stringify short string x 12,944,272 ops/sec ±0.09% (96 runs sampled)
fast-json-stringify short string x 30,585,790 ops/sec ±0.27% (97 runs sampled)
compile-json-stringify short string x 30,656,406 ops/sec ±0.12% (96 runs sampled)
AJV Serialize short string x 30,406,785 ops/sec ±0.37% (96 runs sampled)
JSON.stringify obj x 3,153,043 ops/sec ±0.33% (99 runs sampled)
fast-json-stringify obj x 6,866,434 ops/sec ±0.11% (100 runs sampled)
compile-json-stringify obj x 15,886,723 ops/sec ±0.15% (98 runs sampled)
AJV Serialize obj x 8,969,043 ops/sec ±0.36% (97 runs sampled)
JSON stringify date x 1,126,547 ops/sec ±0.09% (97 runs sampled)
fast-json-stringify date format x 1,836,188 ops/sec ±0.12% (99 runs sampled)
compile-json-stringify date format x 1,125,735 ops/sec ±0.19% (98 runs sampled)
Example
Options
API
fastJsonStringify
Specific use cases
Required
Missing fields
Pattern Properties
Additional Properties
AnyOf
dan OneOf
Reuse - $ref
Long integers
Integers
Nullable
Large Arrays
Security Notice
Debug Mode
Standalone Mode
Acknowledgements
License
Cobalah di RunKit: https://runkit.com/npm/fast-json-stringify
const fastJson = require ( 'fast-json-stringify' )
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
firstName : {
type : 'string'
} ,
lastName : {
type : 'string'
} ,
age : {
description : 'Age in years' ,
type : 'integer'
} ,
reg : {
type : 'string'
}
}
} )
console . log ( stringify ( {
firstName : 'Matteo' ,
lastName : 'Collina' ,
age : 32 ,
reg : / "([^"]|\")*" /
} ) )
Secara opsional, Anda dapat menyediakan fast-json-stringify
objek opsi sebagai parameter kedua:
const fastJson = require ( 'fast-json-stringify' )
const stringify = fastJson ( mySchema , {
schema : { ... } ,
ajv : { ... } ,
rounding : 'ceil'
} )
schema
: referensi skema eksternal berdasarkan properti $ref. Lebih detailnyaajv
: pengaturan instance ajv v8 untuk properti yang memerlukan ajv
. Lebih detailnyarounding
: mengatur bagaimana tipe integer
akan dibulatkan jika bukan bilangan bulat. Lebih detailnyalargeArrayMechanism
: mengatur mekanisme yang harus digunakan untuk menangani array besar (secara default 20000
item atau lebih). Lebih detailnya Bangun fungsi stringify()
berdasarkan spesifikasi jsonschema draft 7.
Jenis yang didukung:
'string'
'integer'
'number'
'array'
'object'
'boolean'
'null'
Dan yang bersarang juga.
Contoh | Berseri sebagai |
---|---|
Date | string melalui toISOString() |
RegExp | string |
BigInt | integer melalui toString |
Format bawaan Skema JSON untuk tanggal didukung dan akan diserialkan sebagai:
Format | Contoh format serial |
---|---|
date-time | 2020-04-03T09:11:08.615Z |
date | 2020-04-03 |
time | 09:11:08 |
Catatan : Dalam kasus Tanggal yang diformat string dan bukan Objek Tanggal, tidak akan ada manipulasi terhadapnya. Itu harus diformat dengan benar.
Contoh dengan objek Tanggal:
const stringify = fastJson ( {
title : 'Example Schema with string date-time field' ,
type : 'string' ,
format : 'date-time'
} )
const date = new Date ( )
console . log ( stringify ( date ) ) // '"YYYY-MM-DDTHH:mm:ss.sssZ"'
Anda dapat mengatur bidang tertentu dari suatu objek seperti yang diwajibkan dalam skema Anda dengan menambahkan nama bidang di dalam larik required
dalam skema Anda. Contoh:
const schema = {
title : 'Example Schema with required field' ,
type : 'object' ,
properties : {
nickname : {
type : 'string'
} ,
mail : {
type : 'string'
}
} ,
required : [ 'mail' ]
}
Jika objek yang akan dirangkai tidak memiliki bidang yang diperlukan, fast-json-stringify
akan menimbulkan kesalahan.
Jika suatu bidang ada dalam skema (dan tidak wajib) tetapi tidak ada dalam objek yang akan dirangkai, fast-json-stringify
tidak akan menuliskannya di string terakhir. Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
nickname : {
type : 'string'
} ,
mail : {
type : 'string'
}
}
} )
const obj = {
mail : '[email protected]'
}
console . log ( stringify ( obj ) ) // '{"mail":"[email protected]"}'
fast-json-stringify
mendukung kunci jsonschema default
untuk membuat serial nilai jika undefined
atau tidak ada.
Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
nickname : {
type : 'string' ,
default : 'the default string'
}
}
} )
console . log ( stringify ( { } ) ) // '{"nickname":"the default string"}'
console . log ( stringify ( { nickname : 'my-nickname' } ) ) // '{"nickname":"my-nickname"}'
fast-json-stringify
mendukung properti pola seperti yang ditentukan oleh skema JSON. patternProperties harus berupa objek, yang kuncinya adalah regex yang valid dan nilainya adalah objek, dideklarasikan dengan cara ini: { type: 'type' }
. patternProperties hanya akan berfungsi untuk properti yang tidak tercantum secara eksplisit di objek properti. Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
nickname : {
type : 'string'
}
} ,
patternProperties : {
'num' : {
type : 'number'
} ,
'.*foo$' : {
type : 'string'
}
}
} )
const obj = {
nickname : 'nick' ,
matchfoo : 42 ,
otherfoo : 'str' ,
matchnum : 3
}
console . log ( stringify ( obj ) ) // '{"matchfoo":"42","otherfoo":"str","matchnum":3,"nickname":"nick"}'
fast-json-stringify
mendukung properti tambahan seperti yang ditentukan oleh skema JSON. tambahanProperti harus berupa objek atau boolean, dideklarasikan dengan cara ini: { type: 'type' }
. tambahanProperties hanya akan berfungsi untuk properti yang tidak secara eksplisit tercantum dalam properti dan objek patternProperties .
Jika tambahanProperties tidak ada atau disetel ke false
, setiap properti yang tidak secara eksplisit tercantum dalam properti dan objek patternProperties , akan diabaikan, seperti yang dijelaskan dalam Bidang yang hilang. Bidang yang hilang diabaikan untuk menghindari keharusan menulis ulang objek sebelum membuat serial. Namun, aturan skema lainnya akan muncul dalam situasi serupa. Jika extraProperties disetel ke true
, ini akan digunakan oleh JSON.stringify
untuk merangkai properti tambahan. Jika Anda ingin mencapai performa maksimal, kami sangat menganjurkan Anda untuk menggunakan skema tetap jika memungkinkan. Properti tambahan akan selalu diserialkan di akhir objek. Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
nickname : {
type : 'string'
}
} ,
patternProperties : {
'num' : {
type : 'number'
} ,
'.*foo$' : {
type : 'string'
}
} ,
additionalProperties : {
type : 'string'
}
} )
const obj = {
nickname : 'nick' ,
matchfoo : 42 ,
otherfoo : 'str' ,
matchnum : 3 ,
nomatchstr : 'valar morghulis' ,
nomatchint : 313
}
console . log ( stringify ( obj ) ) // '{"nickname":"nick","matchfoo":"42","otherfoo":"str","matchnum":3,"nomatchstr":"valar morghulis",nomatchint:"313"}'
fast-json-stringify
mendukung kata kunci anyOf dan oneOf seperti yang ditentukan oleh skema JSON. Keduanya harus berupa array skema JSON yang valid. Skema yang berbeda akan diuji dalam urutan yang ditentukan. Semakin banyak skema yang harus stringify
sebelum menemukan kecocokan, akan semakin lambat.
anyOf dan oneOf menggunakan ajv sebagai validator skema JSON untuk menemukan skema yang cocok dengan data. Hal ini berdampak pada kinerja—gunakan hanya sebagai upaya terakhir.
Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
'undecidedType' : {
'anyOf' : [ {
type : 'string'
} , {
type : 'boolean'
} ]
}
}
} )
Saat menentukan skema JSON objek untuk anyOf , tambahkan kata kunci validasi yang diperlukan agar hanya mencocokkan objek dengan properti yang Anda inginkan.
Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'array' ,
items : {
anyOf : [
{
type : 'object' ,
properties : {
savedId : { type : 'string' }
} ,
// without "required" validation any object will match
required : [ 'savedId' ]
} ,
{
type : 'object' ,
properties : {
error : { type : 'string' }
} ,
required : [ 'error' ]
}
]
}
} )
fast-json-stringify
mendukung fitur jsonschema if/then/else
. Lihat dokumentasi ajv.
Contoh:
const stringify = fastJson ( {
'type' : 'object' ,
'properties' : {
} ,
'if' : {
'properties' : {
'kind' : { 'type' : 'string' , 'enum' : [ 'foobar' ] }
}
} ,
'then' : {
'properties' : {
'kind' : { 'type' : 'string' , 'enum' : [ 'foobar' ] } ,
'foo' : { 'type' : 'string' } ,
'bar' : { 'type' : 'number' }
}
} ,
'else' : {
'properties' : {
'kind' : { 'type' : 'string' , 'enum' : [ 'greeting' ] } ,
'hi' : { 'type' : 'string' } ,
'hello' : { 'type' : 'number' }
}
}
} )
console . log ( stringify ( {
kind : 'greeting' ,
foo : 'FOO' ,
bar : 42 ,
hi : 'HI' ,
hello : 45
} ) ) // {"kind":"greeting","hi":"HI","hello":45}
console . log ( stringify ( {
kind : 'foobar' ,
foo : 'FOO' ,
bar : 42 ,
hi : 'HI' ,
hello : 45
} ) ) // {"kind":"foobar","foo":"FOO","bar":42}
NB Jangan mendeklarasikan properti dua kali atau Anda akan mencetaknya dua kali!
Jika Anda ingin menggunakan kembali definisi suatu nilai, Anda dapat menggunakan properti $ref
. Nilai $ref
harus berupa string dalam format JSON Pointer. Contoh:
const schema = {
title : 'Example Schema' ,
definitions : {
num : {
type : 'object' ,
properties : {
int : {
type : 'integer'
}
}
} ,
str : {
type : 'string'
}
} ,
type : 'object' ,
properties : {
nickname : {
$ref : '#/definitions/str'
}
} ,
patternProperties : {
'num' : {
$ref : '#/definitions/num'
}
} ,
additionalProperties : {
$ref : '#/definitions/def'
}
}
const stringify = fastJson ( schema )
Jika Anda perlu menggunakan definisi eksternal, Anda dapat meneruskannya sebagai opsi ke fast-json-stringify
. Contoh:
const schema = {
title : 'Example Schema' ,
type : 'object' ,
properties : {
nickname : {
$ref : 'strings#/definitions/str'
}
} ,
patternProperties : {
'num' : {
$ref : 'numbers#/definitions/num'
}
} ,
additionalProperties : {
$ref : 'strings#/definitions/def'
}
}
const externalSchema = {
numbers : {
definitions : {
num : {
type : 'object' ,
properties : {
int : {
type : 'integer'
}
}
}
}
} ,
strings : require ( './string-def.json' )
}
const stringify = fastJson ( schema , { schema : externalSchema } )
Definisi eksternal juga dapat saling merujuk. Contoh:
const schema = {
title : 'Example Schema' ,
type : 'object' ,
properties : {
foo : {
$ref : 'strings#/definitions/foo'
}
}
}
const externalSchema = {
strings : {
definitions : {
foo : {
$ref : 'things#/definitions/foo'
}
}
} ,
things : {
definitions : {
foo : {
type : 'string'
}
}
}
}
const stringify = fastJson ( schema , { schema : externalSchema } )
Secara default perpustakaan akan menangani BigInt secara otomatis.
Properti type: integer
akan terpotong jika floating point disediakan. Anda dapat menyesuaikan perilaku ini dengan opsi rounding
yang menerima round
, ceil
, floor
atau trunc
. Standarnya adalah trunc
:
const stringify = fastJson ( schema , { rounding : 'ceil' } )
Menurut spesifikasi Open API 3.0, nilai yang bisa berupa null harus dinyatakan nullable
.
const stringify = fastJson ( {
'title' : 'Nullable schema' ,
'type' : 'object' ,
'nullable' : true ,
'properties' : {
'product' : {
'nullable' : true ,
'type' : 'object' ,
'properties' : {
'name' : {
'type' : 'string'
}
}
}
}
} )
console . log ( stringify ( { product : { name : "hello" } } ) ) // "{"product":{"name":"hello"}}"
console . log ( stringify ( { product : null } ) ) // "{"product":null}"
console . log ( stringify ( null ) ) // null
Jika tidak, alih-alih memunculkan kesalahan, nilai null akan dipaksakan sebagai berikut:
integer
-> 0
number
-> 0
string
-> ""
boolean
-> false
object
-> {}
array
-> []
Array besar, untuk cakupan dokumen ini, didefinisikan sebagai array yang berisi, secara default, 20000
elemen atau lebih. Nilai tersebut dapat disesuaikan melalui parameter opsi largeArraySize
.
Pada titik tertentu, overhead yang disebabkan oleh mekanisme default yang digunakan oleh fast-json-stringify
untuk menangani array mulai meningkat secara eksponensial, sehingga menyebabkan lambatnya eksekusi secara keseluruhan.
Untuk meningkatkannya, pengguna dapat mengatur opsi largeArrayMechanism
dan largeArraySize
.
Nilai default largeArrayMechanism
adalah default
. Nilai yang valid untuk itu adalah:
default
- Opsi ini merupakan kompromi antara performa dan kumpulan fitur dengan tetap menyediakan fungsionalitas yang diharapkan dari lib ini tetapi melepaskan beberapa kemungkinan peningkatan performa. Dengan rangkaian opsi ini, array besar akan dirangkai dengan menggabungkan elemen-elemen yang dirangkai menggunakan Array.join
alih-alih penggabungan string untuk kinerja yang lebih baikjson-stringify
- Opsi ini akan sepenuhnya menghapus dukungan untuk validasi skema dalam array besar . Dengan melakukan hal ini, overhead yang disebutkan sebelumnya dihilangkan, sehingga sangat meningkatkan waktu eksekusi. Ingat, tidak ada perubahan perilaku untuk array yang tidak dianggap besar Nilai default largeArraySize
adalah 20000
. Nilai yang valid untuknya adalah nilai seperti bilangan bulat, seperti:
20000
2e4
'20000'
'2e4'
- perhatikan ini akan dikonversi menjadi 2
, bukan 20000
1.5
- perhatikan ini akan dikonversi menjadi 1
Secara default, perpustakaan lolos dari semua string. Dengan format 'tidak aman', string tidak di-escape. Ini memiliki masalah keamanan yang berpotensi berbahaya. Anda dapat menggunakannya hanya jika Anda yakin bahwa data Anda tidak perlu di-escape. Keuntungannya adalah peningkatan kinerja yang signifikan.
Contoh:
const stringify = fastJson ( {
title : 'Example Schema' ,
type : 'object' ,
properties : {
'code' : {
type : 'string' ,
format 'unsafe'
}
}
} )
Sebagai referensi, berikut beberapa tolok ukur perbandingan ketiga mekanisme tersebut. Benchmark dilakukan pada mesin lama.
ST1000LM024 HN-M 1TB HDD, Intel Core i7-3610QM @ 2.3GHz, 12GB RAM, 4C/8T
.v16.13.1
JSON.stringify large array x 157 ops/sec ±0.73% (86 runs sampled)
fast-json-stringify large array default x 48.72 ops/sec ±4.92% (48 runs sampled)
fast-json-stringify large array json-stringify x 157 ops/sec ±0.76% (86 runs sampled)
compile-json-stringify large array x 175 ops/sec ±4.47% (79 runs sampled)
AJV Serialize large array x 58.76 ops/sec ±4.59% (60 runs sampled)
Perlakukan definisi skema sebagai kode aplikasi, tidak aman menggunakan skema yang disediakan pengguna.
Untuk mencapai redaksi berbiaya rendah dan berkinerja tinggi fast-json-stringify
membuat dan mengkompilasi fungsi (menggunakan konstruktor Function
) pada inisialisasi. Meskipun schema
saat ini divalidasi untuk mendeteksi kesalahan pengembang, tidak ada jaminan bahwa penyediaan skema yang dibuat pengguna tidak akan membuat aplikasi Anda terkena serangan jarak jauh.
Pengguna bertanggung jawab untuk mengirimkan data tepercaya. fast-json-stringify
menjamin bahwa Anda akan mendapatkan keluaran yang valid hanya jika masukan Anda cocok dengan skema atau dapat dipaksakan ke skema. Jika masukan Anda tidak cocok dengan skema, Anda akan mendapatkan perilaku tidak terdefinisi.
Mode debug dapat diaktifkan selama pengembangan Anda untuk memahami apa yang terjadi ketika segala sesuatunya tidak berjalan sesuai harapan.
const debugCompiled = fastJson ( {
title : 'default string' ,
type : 'object' ,
properties : {
firstName : {
type : 'string'
}
}
} , { mode : 'debug' } )
console . log ( debugCompiled ) // it is a object contain code, ajv instance
const rawString = debugCompiled . code // it is the generated code
console . log ( rawString )
const stringify = fastJson . restore ( debugCompiled ) // use the generated string to get back the `stringify` function
console . log ( stringify ( { firstName : 'Foo' , surname : 'bar' } ) ) // '{"firstName":"Foo"}'
Mode mandiri digunakan untuk mengkompilasi kode yang dapat langsung dijalankan oleh node
itu sendiri. Anda harus menginstal fast-json-stringify
agar kode mandiri dapat berfungsi.
const fs = require ( 'fs' )
const code = fastJson ( {
title : 'default string' ,
type : 'object' ,
properties : {
firstName : {
type : 'string'
}
}
} , { mode : 'standalone' } )
fs . writeFileSync ( 'stringify.js' , code )
const stringify = require ( 'stringify.js' )
console . log ( stringify ( { firstName : 'Foo' , surname : 'bar' } ) ) // '{"firstName":"Foo"}'
Proyek ini disponsori dengan baik oleh nearForm.
MIT