json-as 0.5.28 → 0.5.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -11
- package/asconfig.json +4 -2
- package/assembly/src/json.ts +14 -0
- package/assembly/test.ts +30 -115
- package/package.json +1 -1
- package/transform/package.json +1 -1
- package/transform/src/index.ts +2 -2
package/README.md
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
# AS-JSON
|
|
2
2
|

|
|
3
3
|

|
|
4
|
+
|
|
5
|
+
Probably the fastest JSON implementation for AssemblyScript with many more optimizations coming down the pipeline.
|
|
4
6
|
## Installation
|
|
5
7
|
|
|
6
8
|
```bash
|
|
7
|
-
|
|
9
|
+
npm install json-as
|
|
8
10
|
```
|
|
9
11
|
```bash
|
|
10
|
-
|
|
12
|
+
npm install visitor-as --save-dev
|
|
11
13
|
```
|
|
12
14
|
|
|
13
15
|
For arbitrary-length numbers, use
|
|
14
16
|
|
|
15
17
|
```bash
|
|
16
|
-
|
|
18
|
+
npm install as-bignum
|
|
17
19
|
```
|
|
18
20
|
|
|
19
21
|
Add the transform to your `asc` command
|
|
@@ -38,14 +40,14 @@ Or, add it to `asconfig.json`
|
|
|
38
40
|
import { JSON } from "json-as/assembly";
|
|
39
41
|
|
|
40
42
|
// @json or @serializable work here
|
|
41
|
-
@
|
|
43
|
+
@json
|
|
42
44
|
class Vec3 {
|
|
43
45
|
x!: f32;
|
|
44
46
|
y!: f32;
|
|
45
47
|
z!: f32;
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
@
|
|
50
|
+
@json
|
|
49
51
|
class Player {
|
|
50
52
|
firstName!: string;
|
|
51
53
|
lastName!: string;
|
|
@@ -73,10 +75,30 @@ const stringified = JSON.stringify<Player>(player);
|
|
|
73
75
|
const parsed = JSON.parse<Player>(stringified);
|
|
74
76
|
```
|
|
75
77
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
Performance
|
|
79
|
-
|
|
78
|
+
## Notes
|
|
79
|
+
|
|
80
|
+
Performance exceeds JavaScript JSON implementation by an average of 230% but this decreases with larger data packets.
|
|
81
|
+
|
|
82
|
+
## Planned Features
|
|
83
|
+
|
|
84
|
+
- [x] Serialize
|
|
85
|
+
- [x] Objects
|
|
86
|
+
- [x] Other Types
|
|
87
|
+
- [ ] Dynamic Types
|
|
88
|
+
- [x] Deserialize
|
|
89
|
+
- [x] Objects
|
|
90
|
+
- [x] Other Types
|
|
91
|
+
- [ ] Dynamic Types
|
|
92
|
+
- [ ] Streaming API
|
|
93
|
+
- [ ] Whitespace support
|
|
94
|
+
- [ ] Integrate features from SIMDJson
|
|
95
|
+
- [x] Optimize
|
|
96
|
+
- [x] Strings
|
|
97
|
+
- [x] Int/Float
|
|
98
|
+
- [x] Bool
|
|
99
|
+
- [x] Object Serialization
|
|
100
|
+
- [ ] Object Parsing
|
|
101
|
+
- [ ] Arrays
|
|
80
102
|
## Performance
|
|
81
103
|
|
|
82
104
|
**Serialize Object (Vec3):** ~11.1m ops/s
|
|
@@ -87,9 +109,9 @@ Performance is nearly equal to the JavaScript JSON implementation which is in C+
|
|
|
87
109
|
|
|
88
110
|
**Deserialize Array (int[]):** ~2.8m ops/s
|
|
89
111
|
|
|
90
|
-
**Serialize String (5):** ~
|
|
112
|
+
**Serialize String (5):** ~4.2m ops/s
|
|
91
113
|
|
|
92
|
-
**Deserialize String (5):** ~
|
|
114
|
+
**Deserialize String (5):** ~12m ops/s
|
|
93
115
|
|
|
94
116
|
## Issues
|
|
95
117
|
|
package/asconfig.json
CHANGED
package/assembly/src/json.ts
CHANGED
|
@@ -40,6 +40,7 @@ export namespace JSON {
|
|
|
40
40
|
export function stringify<T>(data: T): string {
|
|
41
41
|
// String
|
|
42
42
|
if (isString<T>() && data != null) {
|
|
43
|
+
// @ts-ignore
|
|
43
44
|
return serializeString(data);
|
|
44
45
|
}
|
|
45
46
|
// Boolean
|
|
@@ -64,21 +65,28 @@ export namespace JSON {
|
|
|
64
65
|
// @ts-ignore
|
|
65
66
|
return data.__JSON_Serialize();
|
|
66
67
|
}
|
|
68
|
+
else if (data instanceof Date) {
|
|
69
|
+
return data.toISOString();
|
|
70
|
+
}
|
|
67
71
|
// ArrayLike
|
|
68
72
|
else if (isArrayLike<T>()) {
|
|
69
73
|
// @ts-ignore
|
|
70
74
|
if (data.length == 0) {
|
|
71
75
|
return emptyArrayWord;
|
|
76
|
+
// @ts-ignore
|
|
72
77
|
} else if (isString<valueof<T>>()) {
|
|
73
78
|
let result = "[";
|
|
79
|
+
// @ts-ignore
|
|
74
80
|
for (let i = 0; i < data.length - 1; i++) {
|
|
75
81
|
// @ts-ignore
|
|
76
82
|
result += serializeString(unchecked(data[i]));
|
|
77
83
|
result += commaWord;
|
|
78
84
|
}
|
|
85
|
+
// @ts-ignore
|
|
79
86
|
result += serializeString(unchecked(data[data.length - 1]));
|
|
80
87
|
result += rightBracketWord;
|
|
81
88
|
return result;
|
|
89
|
+
// @ts-ignore
|
|
82
90
|
} else if (isFloat<valueof<T>>() || isInteger<valueof<T>>()) {
|
|
83
91
|
let result = new StringSink(leftBracketWord);
|
|
84
92
|
// @ts-ignore
|
|
@@ -140,6 +148,9 @@ export namespace JSON {
|
|
|
140
148
|
// @ts-ignore
|
|
141
149
|
} else if (isDefined(type.__JSON_Set_Key)) {
|
|
142
150
|
return parseObject<T>(data.trimStart());
|
|
151
|
+
} else if (idof<nonnull<T>>() == idof<Date>()) {
|
|
152
|
+
// @ts-ignore
|
|
153
|
+
return Date.fromString(data);
|
|
143
154
|
} else if ((isManaged<T>() || isReference<T>()) && isBigNum<T>()) {
|
|
144
155
|
// @ts-ignore
|
|
145
156
|
return parseBigNum<T>(data);
|
|
@@ -169,6 +180,9 @@ export namespace JSON {
|
|
|
169
180
|
// @ts-ignore
|
|
170
181
|
} else if (isDefined(type.__JSON_Set_Key)) {
|
|
171
182
|
return parseObject<T>(data.trimStart());
|
|
183
|
+
} else if (idof<nonnull<T>>() == idof<Date>()) {
|
|
184
|
+
// @ts-ignore
|
|
185
|
+
return Date.fromString(data);
|
|
172
186
|
} else if ((isManaged<T>() || isReference<T>()) && isBigNum<T>()) {
|
|
173
187
|
// @ts-ignore
|
|
174
188
|
return parseBigNum<T>(data);
|
package/assembly/test.ts
CHANGED
|
@@ -1,129 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
JSON
|
|
4
|
-
} from ".";
|
|
5
|
-
import { unsafeCharCodeAt } from "./src/util";
|
|
6
|
-
import { backSlashCode, quoteCode } from "./src/chars";
|
|
1
|
+
import { JSON } from "./src/json";
|
|
7
2
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/*console.log(JSON.stringify([
|
|
11
|
-
"abcdefg",
|
|
12
|
-
'st"ring" w""ith quotes"',
|
|
13
|
-
'string \t\r"with ran\tdom spa\nces and \nnewlines\n\n\n',
|
|
14
|
-
'string with colon : comma , brace [ ] bracket { } and quote " and other quote "',
|
|
15
|
-
]));*/
|
|
16
|
-
|
|
17
|
-
const str = "\\\""
|
|
18
|
-
|
|
19
|
-
function parseString(data: string): string {
|
|
20
|
-
let result = "";
|
|
21
|
-
let last = 1;
|
|
22
|
-
let char = 0;
|
|
23
|
-
for (let i = 1; i < data.length - 1; i++) {
|
|
24
|
-
// \\"
|
|
25
|
-
if (unsafeCharCodeAt(data, i) === backSlashCode) {
|
|
26
|
-
char = unsafeCharCodeAt(data, ++i);
|
|
27
|
-
result += data.slice(last, i - 1)
|
|
28
|
-
if (char === 34) {
|
|
29
|
-
result += "\"";
|
|
30
|
-
last = ++i;
|
|
31
|
-
} else if (char === 110) {
|
|
32
|
-
result += "\n";
|
|
33
|
-
last = ++i;
|
|
34
|
-
// 92 98 114 116 102 117
|
|
35
|
-
} else if (char >= 92 && char <= 117) {
|
|
36
|
-
if (char === 92) {
|
|
37
|
-
result += "\\";
|
|
38
|
-
last = ++i;
|
|
39
|
-
} else if (char === 98) {
|
|
40
|
-
result += "\b";
|
|
41
|
-
last = ++i;
|
|
42
|
-
} else if (char === 102) {
|
|
43
|
-
result += "\f";
|
|
44
|
-
last = ++i;
|
|
45
|
-
} else if (char === 114) {
|
|
46
|
-
result += "\r";
|
|
47
|
-
last = ++i;
|
|
48
|
-
} else if (char === 116) {
|
|
49
|
-
result += "\t";
|
|
50
|
-
last = ++i;
|
|
51
|
-
} else if (char === 117 && load<u64>(changetype<usize>(data) + <usize>((i + 1) << 1)) === 27584753879220272) {
|
|
52
|
-
result += "\u000b";
|
|
53
|
-
i += 4;
|
|
54
|
-
last = ++i;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
result += data.slice(last, data.length - 1);
|
|
60
|
-
return result;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
console.log(parseString("\"Hello W\\\"orld!\""));
|
|
64
|
-
console.log(parseString("\"Hello New \\nWorld!\""));
|
|
65
|
-
console.log(parseString("\"\\t TAB Hello World!\""));
|
|
66
|
-
console.log(JSON.stringify(parseString("\"U000B \\u000b Hello World!\"")));
|
|
67
|
-
console.log(load<u32>(changetype<usize>(str)).toString());
|
|
68
|
-
console.log(load<u8>(changetype<usize>(str)).toString());
|
|
69
|
-
console.log(load<u8>(changetype<usize>(str) + <usize>2).toString());
|
|
70
|
-
|
|
71
|
-
console.log("abcdefg");
|
|
72
|
-
console.log('st"ring" w""ith quotes"');
|
|
73
|
-
console.log('string \t\r"with ran\tdom spa\nces and \nnewlines\n\n\n');
|
|
74
|
-
console.log('string with colon : comma , brace [ ] bracket { } and quote " and other quote "');
|
|
75
|
-
|
|
76
|
-
console.log(JSON.stringify("abcdefg"));
|
|
77
|
-
console.log(JSON.stringify('st"ring" w""ith quotes"'));
|
|
78
|
-
console.log(JSON.stringify('string \t\r"with ran\tdom spa\nces and \nnewlines\n\n\n'));
|
|
79
|
-
console.log(JSON.stringify('string with colon : comma , brace [ ] bracket { } and quote " and other quote "'));
|
|
80
|
-
|
|
81
|
-
console.log(JSON.stringify("Hello W\"orld!"));
|
|
82
|
-
|
|
83
|
-
console.log("U000B: \u000b")
|
|
84
|
-
// @ts-ignore
|
|
85
|
-
@JSON
|
|
3
|
+
// @json or @serializable work here
|
|
4
|
+
@json
|
|
86
5
|
class Vec3 {
|
|
87
|
-
x
|
|
88
|
-
y
|
|
89
|
-
z
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// @ts-ignore
|
|
93
|
-
@JSON
|
|
94
|
-
class Stats extends Vec3 {
|
|
95
|
-
wins: u128
|
|
96
|
-
loss: u128
|
|
6
|
+
x!: f32;
|
|
7
|
+
y!: f32;
|
|
8
|
+
z!: f32;
|
|
97
9
|
}
|
|
98
10
|
|
|
99
|
-
// @ts-ignore
|
|
100
11
|
@json
|
|
101
12
|
class Player {
|
|
102
|
-
firstName
|
|
103
|
-
lastName
|
|
104
|
-
lastActive
|
|
105
|
-
age
|
|
106
|
-
|
|
107
|
-
|
|
13
|
+
firstName!: string;
|
|
14
|
+
lastName!: string;
|
|
15
|
+
lastActive!: i32[];
|
|
16
|
+
age!: i32;
|
|
17
|
+
pos!: Vec3 | null;
|
|
18
|
+
isVerified!: boolean;
|
|
108
19
|
}
|
|
109
20
|
|
|
110
21
|
const player: Player = {
|
|
111
22
|
firstName: "Emmet",
|
|
112
23
|
lastName: "West",
|
|
113
|
-
lastActive: [
|
|
114
|
-
8,
|
|
115
|
-
27,
|
|
116
|
-
2022
|
|
117
|
-
],
|
|
24
|
+
lastActive: [8, 27, 2022],
|
|
118
25
|
age: 23,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
26
|
+
pos: {
|
|
27
|
+
x: 3.4,
|
|
28
|
+
y: 1.2,
|
|
29
|
+
z: 8.3
|
|
30
|
+
},
|
|
31
|
+
isVerified: true
|
|
124
32
|
};
|
|
125
33
|
|
|
126
|
-
const
|
|
127
|
-
console.log(
|
|
128
|
-
|
|
129
|
-
|
|
34
|
+
const stringified = JSON.stringify<Player>(player);
|
|
35
|
+
console.log(stringified);
|
|
36
|
+
|
|
37
|
+
const parsed = JSON.parse<Player>(stringified);
|
|
38
|
+
console.log(JSON.stringify(parsed));
|
|
39
|
+
|
|
40
|
+
const stringifiedDate = JSON.stringify(new Date(1677961186339));
|
|
41
|
+
console.log(stringifiedDate);
|
|
42
|
+
|
|
43
|
+
const parsedDate = JSON.parse<Date>(stringifiedDate);
|
|
44
|
+
console.log(JSON.stringify(parsedDate));
|
package/package.json
CHANGED
package/transform/package.json
CHANGED
package/transform/src/index.ts
CHANGED
|
@@ -148,8 +148,8 @@ class AsJSONTransform extends BaseVisitor {
|
|
|
148
148
|
|
|
149
149
|
this.schemasList.push(this.currentClass);
|
|
150
150
|
|
|
151
|
-
console.log(serializeFunc);
|
|
152
|
-
console.log(setKeyFunc);
|
|
151
|
+
//console.log(serializeFunc);
|
|
152
|
+
//console.log(setKeyFunc);
|
|
153
153
|
}
|
|
154
154
|
visitSource(node: Source): void {
|
|
155
155
|
super.visitSource(node);
|