joyson
is a JavaScript module designed for efficient encoding and decoding of JSON objects, particularly adept at handling TypedArrays. Unlike standard JSON methods, joyson
provides additional pack
and unpack
methods for more memory-efficient handling of large data structures, including support for binary data serialization.
- Standard JSON Methods:
stringify
andparse
convert objects to/from JSON strings. - Extended Binary Methods:
pack
andunpack
handle serialization/deserialization of data into/from a compact binary format, beneficial for performance-intensive applications.
- TypedArray Support: Seamless encoding and decoding of TypedArrays within JSON objects.
- Memory Efficiency: Optimized for minimal memory footprint during processing.
- Binary Serialization: The
pack
method allows for compact binary serialization of data, whileunpack
restores it, ensuring efficient data handling.
Install joyson
using npm:
npm install joyson
Import JOYSON
from joyson
:
import JOYSON from 'joyson';
Using /dist/browser.min.js` enable you to directly use JOYSON like JSON
const object = {test: "hello", data: [1, 23, 5, 6, {"##": undefined, "##test": /regex/i, date: new Date(), table: [-0, 111111111n, -666.777, new Set([1, 2, "blue", {}]), new Map()], arr: Int16Array.of(-6, 777, 12), arr2: new Uint8Array(9)}, "hello here is asaitama I love JS"]};
const encoded = JOYSON.stringify(object); // `{"test":"hello","data":[1,23,5,6,{"#$IyM=":"data:joyson/undefined;","#$IyN0ZXN0":"data:joyson/regexp;cmVnZXg=:aQ==","##date":"data:joyson/date;2023-12-25T00:33:37.935Z","table":["data:joyson/number;-0","data:joyson/bigint;111111111",-666.777,"data:joyson/set;WzEsMiwiYmx1ZSIse31d","data:joyson/map;W10="],"##arr":"data:joyson/int16array;base64,+v8JAwwA","##arr2":"data:joyson/uint8array;base64,AAAAAAAAAAAA"},"hello here is asaitama I love JS"]}`
const decoded = JOYSON.parse(encoded);
console.log(object, encoded, decoded);
const yourObject = {test: "hello", data: [1, 23, 5, 6, {arr: Int16Array.of(-6, 777, 12), arr2: new Uint8Array(9)}]};
const packedData = JOYSON.pack(yourObject); // Uint8Array of 151 Bytes
const unpackedData = JOYSON.unpack(packedData);
console.log(packedData, unpackedData);
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
null | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
undefined | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
Score | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 1/2 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
"" | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"primitive string" | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"sample string" | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"null(\x00)" | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"\x00\x00null\x00\x00" | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Score | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
2000 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
NaN | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
EPSILON | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-EPSILON | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MAX_SAFE_INTEGER | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MIN_SAFE_INTEGER | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
MIN_VALUE | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-Infinity | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
Infinity | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
-0xffffffff | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-0x80000000 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-0x7fffffff | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-2000 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-111.456 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-0 | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
111.456 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
0x7fffffff | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
0x80000000 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
0xffffffff | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Score | 21/21 | 21/21 | 20/21 | 20/21 | 20/21 | 21/21 | 18/21 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
-111111111111111111111111111n | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
-12345678901234567890n | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
-9223372036n | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
-1n | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
0n | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
1n | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
9223372036n | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
9223372036854775807n | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
18446744073709551615n | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
111111111111111111111111111n | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Score | 10/10 | 10/10 | 6/10 | 4/10 | 6/10 | 0/10 | 0/10 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
property order matter | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
{a: 'b'} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{a: 1} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{'': null} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{'': ''} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{'': undefined} | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
{'': 0} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{' ': 0} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{'': false} | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
{'\x00': '\x00'} | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
Score | 10/10 | 10/10 | 10/10 | 9/10 | 10/10 | 9/10 | 9/10 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
Object(true) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Object(false) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Object(2n) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Object(-2n) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Object(NaN) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Object("string") | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Score | 6/6 | 6/6 | 0/6 | 0/6 | 0/6 | 0/6 | 0/6 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
Array property order matter | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
[] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
[1, 2, 3] | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Score | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
Uint8Array([]) | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
Uint8Array([0, 1, 254, 255]) | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
Uint16Array([0x0000, 0x0001, 0xFFFE, 0xFFFF]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
Uint32Array([0x00000000, 0x00000001, 0xFFFFFFFE, 0xFFFFFFFF]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
Int8Array([0, 1, 254, 255]) | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
Int16Array([0x0000, 0x0001, 0xFFFE, 0xFFFF]) | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
Int32Array([0x00000000, 0x00000001, 0xFFFFFFFE, 0xFFFFFFFF]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
Uint8ClampedArray([0, 1, 254, 255]) | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
Float32Array([-Infinity, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, Infinity, NaN]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ |
Score | 9/9 | 9/9 | 6/9 | 4/9 | 9/9 | 0/9 | 9/9 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
new ArrayBuffer(0) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
new Uint8Array([0, 1, 254, 255]).buffer | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Score | 2/2 | 2/2 | 0/2 | 0/2 | 0/2 | 0/2 | 0/2 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
new Date(-1666709071331) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(-1e12) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(-1e9) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(-1e6) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(-1e3) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(0) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(1e3) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(1e6) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(1e9) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(1e12) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(1e13) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
new Date(1666709071331) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
Score | 12/12 | 12/12 | 12/12 | 0/12 | 12/12 | 12/12 | 0/12 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
new Map() | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
new Map([["a", "b"]]) | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
new Map([["a", "b"], ["c", "d"]]) | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
new Map([[{}, "b"], [1, "d"]]) | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
Score | 4/4 | 4/4 | 4/4 | 4/4 | 0/4 | 0/4 | 0/4 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
new Set() | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
new Set(["a", "b"]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
new Set(["a", "b", "c", "d"]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
new Set([{}, 1]) | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
Score | 4/4 | 4/4 | 4/4 | 0/4 | 4/4 | 0/4 | 0/4 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
new Error('Error') | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ |
new EvalError('EvalError') | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
new RangeError('RangeError') | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
new ReferenceError('ReferenceError') | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
new SyntaxError('SyntaxError') | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
new TypeError('TypeError') | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
new URIError('URIError') | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Score | 7/7 | 7/7 | 3/7 | 1/7 | 0/7 | 0/7 | 1/7 |
Feature | core-js | joyson | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
new RegExp() | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/g | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/i | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/gi | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/m | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/mg | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/mi | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/mgi | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
/abc/gimsuy | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
Score | 10/10 | 10/10 | 10/10 | 0/10 | 10/10 | 9/10 | 0/10 |
- Loading Speed: Very slow, longest time 800ms.
- Rating:
- Encoding: 2.0/10
- Decoding: 2.5/10
- Longest: 1.0/10
- Average: 3.0/10
- Shortest: 4.0/10
- Total: 2.5/10
- Performance: Exceptionally fast, longest time 3-4ms.
- Rating:
- Encoding: 9.5/10
- Decoding: 9.5/10
- Longest: 9.5/10
- Average: 9.7/10
- Shortest: 9.8/10
- Total: 9.6/10
- Initial Encoding Speed: Initially slow but improves.
- Balanced Performance: Post-initial usage shows good balance.
- Rating:
- Encoding: 8.0/10 (initially lower, improves over time)
- Decoding: 8.5/10
- Longest: 8.0/10
- Average: 8.5/10
- Shortest: 9.0/10
- Total: 8.5/10
- BSON: Best for specific ecosystems like MongoDB, but slow.
- Joyson: Top choice for high-speed, efficient data processing.
- Message Packer: Excellent for long-running applications with a balance between encoding and decoding post-initial usage.
Feature | core-js | joyson (pack/unpack) | msgpackr | cbor-x | cborg | bson | structured-clone |
---|---|---|---|---|---|---|---|
Average time (ms) | 0.1391 | 0.7914 | 1.1096 | 1.5174 | 1.6761 | 9.4376 | 5.3649 |
Longest time (ms) | 4.4 | 1.9 | 35.8 | 44.5 | 49.4 | 1128.9 | 10.7 |
Shortest time (ms) | 0 | 0.6 | 0.5 | 0.8 | 1 | 4.6 | 4.7 |
Total time (ms) | 139.1 | 791.4 (100%) | 1109.6 (140%) | 1517.4 (191%) | 1676.1 (211%) | 9437.6 (1193%) | 5364.9 (678%) |
Used size (bytes) | N/A | 41684 | 33983 | 29105 | 37715 | 43431 | 43276 |